第九章: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 沒有擁有(蘊含)特定的許可權。也就是說,使用者沒有特定的能力。