1. 程式人生 > 其它 >第九章:Shiro的Web——深入淺出學Shiro細粒度許可權開發框架

第九章:Shiro的Web——深入淺出學Shiro細粒度許可權開發框架

Shiro可以和普通web整合的,但考慮到現在的應用基本都會使用spring,所以就不去講最基本的web集成了。跟Spring整合的方式前面已經講過了。

在Web應用中,可以配置[urls]:

  [urls]項允許你做一些在我們已經見過的任何Web 框架都不存在的東西:在你的應用程式中定義自適應過濾器鏈來匹配URL 路徑!

[urls]的格式

  URL_Ant_Path_Expression = Path_Specific_Filter_Chain

例如:

[urls]

/index.html = anon

/user/create = anon

/user/** = authc

/admin/** = authc, roles[administrator]

/rest/** = authc, rest

/remoting/rpc/** = authc, perms["remot:invoke"]

nURL Path Expressions

  等號左邊是一個與Web 應用程式上下文根目錄相關的Ant 風格的路徑表示式。

  它是第一次匹配優先的方式,比如:

  /account/** = ssl, authc

  /account/signup = anon

  如果傳入的請求旨在訪問/account/signup/index.html(所有'anon'ymous 用

戶都能訪問),那麼它將永不會被處理!原因是因為/account/**的模式第一個匹配了傳入的請求,“短路”了其餘的定義。

Filter Chain Definitions

  等號右邊是逗號隔開的過濾器列表,用來執行匹配該路徑的請求。它必須符合以下格式:filter1[optional_config1], filter2[optional_config2], ...

(1)filterN 是一個定義在[main]項中的filter bean 的名字

(2)[optional_configN]是一個可選的括號內的對特定的路徑,特定的過濾器有特定含義的字串(每個過濾器,每個路徑的具體配置!)。若果該過濾器對該URL 路徑並不需要特定的配置,你可以忽略括號,於是filteNr[]就變成了filterN.

預設的Filter 例項

anon:例子/admins/**=anon 沒有引數,表示可以匿名使用

authc:例如/admins/user/**=authc表示需要認證(登入)才能使用,沒有引數

authcBasic:例如/admins/user/**=authcBasic沒有引數表示httpBasic認證

logout:登出登入的時候,完成一定的功能,任何現有的Session 都將會失效,而且任何身份都將會失去關聯(例如,在Web 應用程式中,RememberMe cookie 也將被刪除)

noSessionCreation:阻止在請求期間建立新的會話來保證無狀態的體驗

perms:例子/admins/user/**=perms[user:add:*],引數可以寫多個,多個時必須加上引號,並且引數之間用逗號分割,例如/admins/user/**=perms[“user:add:*,user:modify:*”],當有多個引數時必須每個引數都通過才通過,想當於isPermitedAll()方法。

port:例子/admins/user/**=port[8081],指定請求訪問的埠

rest:例子/admins/user/**=rest[user],根據請求的方法,相當於/admins/user/**=perms[user:method] ,其中method為post,get,delete等。

nroles:例子/admins/user/**=roles[admin],引數可以寫多個,多個時必須加上引號,並且引數之間用逗號分割,當有多個引數時,例如admins/user/**=roles[“admin,guest”],每個引數通過才算通過,相當於hasAllRoles()方法。

ssl:例子/admins/user/**=ssl沒有引數,表示安全的url請求,協議為https

user:例如/admins/user/**=user沒有引數表示必須存在使用者,當登入操作時不做檢查

Tag Libary

引入Tag

  <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

The guest tag

  guest 標籤將顯示它包含的內容,僅噹噹前的Subject 被認為是‘guest’時。‘guest’是指沒有身份ID 的任何Subject。也就是說,我們並不知道使用者是誰,因為他們沒有登入並且他們沒有在上一次的訪問中被記住(RememberMe 服務), guest 標籤與user 標籤邏輯相反。例子:

<shiro:guest>
  Hi there! Please <a href="login.jsp">Login</a> or <a   href="signup.jsp">Signup</a>today!
</shiro:guest>

The user tag

  user 標籤將顯示它包含的內容,僅噹噹前的Subject 被認為是‘user’時。‘user’在上下文中被定義為一個已知身份ID的Subject,或是成功通過身份驗證及通過‘RememberMe’服務的。請注意這個標籤在語義上與authenticated 標籤是不同的,authenticated 標籤更為嚴格。usre 標籤與guest 標籤邏輯相反。

The authenticated tag

  僅僅只噹噹前使用者在當前會話中成功地通過了身份驗證authenticated 標籤才會顯示包含的內容。它比‘user’標籤更為嚴格。它在邏輯上與‘notAuthenticated’標籤相反。

The notAuthenticated tag

  notAuthenticated 標籤將會顯示它所包含的內容,如果當前Subject 還沒有在其當前會話中成功地通過驗證。

The principal tag

  principal 標籤將會輸出Subject 的主體(標識屬性)或主要的屬性。

The hasRole tag

  hasRole 標籤將會顯示它所包含的內容,僅噹噹前Subject 被分配了具體的角色。 hasRole 標籤與lacksRole 標籤邏輯相反。 例如:

<shiro:hasRole name="administrator">
<a href="admin.jsp">Administer the system</a>
</shiro:hasRole>

The lacksRole tag

lacksRole 標籤將會顯示它所包含的內容,僅噹噹前Subject 未被分配具體的角色

The hasAnyRoles tag

 hasAnyRole 標籤將會顯示它所包含的內容,如果當前的Subject 被分配了任意一個來自於逗號分隔的角色名列表中的具體角色。例如:

<shiro:hasAnyRoles name="developer, project manager, administrator">
You are either a developer, project manager, or administrater.
</shiro:hasAnyRoles>

The hasPermission tag

  hasPermission 標籤將會顯示它所包含的內容,僅噹噹前Subject“擁有”(蘊含)特定的許可權。也就是說,使用者具有特定的能力。hasPermission 標籤與lacksPermission 標籤邏輯相反。例如:

<shiro:hasPermission name="user:create">
<a href="createUser.jsp">Create a new User</a>
</shiro:hasPermission>

The lacksPermission tag

  lacksPermission 標籤將會顯示它所包含的內容,僅噹噹前Subject 沒有擁有(蘊含)特定的許可權。也就是說,使用者沒有特定的能力。