Shiro過濾器:
- 當shiro被運用到web項目時,shiro會自動創建一些默認的過濾器對客戶端請求進行過濾。比如身份驗證、授權的相關的。默認攔截器可以參考 org.apache.shiro.web.filter.mgt.DefaultFilter中的枚舉 攔截器:
- 以下是shiro提供的過濾器:
- 注意:
anon,authcBasic,auchc,user是認證過濾器。
perms,roles,ssl,rest,port是授權過濾器。
Shiro標簽:
- 引入shiro標簽庫(html):
1 <html lang="en" xmlns:th="http://www.thymeleaf.org" 2 xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
- shiro的標簽:
- 下圖為shiro標簽庫中定義的方法:
-
shiro:authenticated (表示已認證通過,但不包括remember me登錄的)
1 <shiro:authenticated> 2 <label>用戶身份驗證已通過 </label> 3 </shiro:authenticated>
說明:只有已通過用戶認證,但不是通過記住我(remember me)瀏覽才會看到標簽內的內容
- shiro:guest (表示是游客身份,沒有登錄)
1 <shiro:guest> 2 <label>您當前是游客,</label><a href="/login.jsp" >請登錄</a> 3 </shiro:guest>
說明:只有是沒有登錄過,以游客的身份瀏覽才會看到標簽內的內容
- shiro:hasAllPermissions(表示擁有這些所有的權限)
1 <shiro:hasAnyPermissions name="user:create,user:update"> 2 <label>擁有user:create和user:update權限</label> 3 </shiro:hasAnyPermissions>
說明:只有成功登錄后,且具有user:create和user:update權限的用戶才可以看到標簽內的內容,name屬性中可以填寫多個權限的名稱,以逗號(,)分隔
- shiro:hasAllRoles(表示擁有這些所有的角色)
1 <shiro:hasAllRoles name="admin,user"> 2 <label>擁有admin和user兩個角色</label> 3 </shiro:hasAllRoles>
說明:只有成功登錄后,且具有admin和user角色的用戶才會看到標簽內的內容;name屬性中可以填寫多個角色名稱,以逗號(,)分隔
- shiro:hasAnyPermissions(表示擁有這些權限中其中一個)
1 <shiro:hasAnyPermissions name="user:create,user:update"> 2 <label>擁有user:create或user:update權限</label> 3 </shiro:hasAnyPermissions>
說明:只有成功登錄后,且具有user:create或者user:update權限的用戶才可以看到標簽內的內容,name屬性中可以填寫多個權限的名稱,以逗號(,)分隔
- shiro:hasAnyRoles(表示擁有這些角色中其中一個)
1 <shiro:hasAnyRoles name="admin,user"> 2 <label>這是擁有admin或者是user角色的用戶</label> 3 </shiro:hasAnyRoles>
說明:只有成功登錄后,且具有admin或者user角色的用戶才會看到標簽內的內容;name屬性中可以填寫多個角色名稱,以逗號(,)分隔
- shiro:hasPermission(表示擁有某一權限)
1 <shiro:hasPermission name="admin:add"> 2 <label>這個用戶擁有admin:add的權限</label> 3 </shiro:hasPermission>
說明:只有成功登錄后,且具有admin:add權限的用戶才可以看到標簽內的內容,name屬性中只能填寫一個權限的名稱
- shiro:hashRole (表示擁有某一角色)
1 <shiro:hasRole name="admin"> 2 <label>這個用戶擁有的角色是admin</label> 3 </shiro:hasRole>
說明:只有成功登錄后,且具有admin角色的用戶才可以看到標簽內的內容,name屬性中只能填寫一個角色的名稱
- shiro:lacksPermission (表示不擁有某一角色)
1 <shiro:lacksPermission name="admin:delete"> 2 <label>這個用戶不擁有admin:delete的權限</label> 3 </shiro:lacksPermission>
說明:只有成功登錄后,且不具有admin:delete權限的用戶才可以看到標簽內的內容,name屬性中只能填寫一個權限的名稱
- shiro:lacksRole (表示不擁有某一角色)
1 <shiro:lacksRole name="admin"> 2 <label>這個用戶不擁有admin的角色</label> 3 </shiro:lacksRole>
說明:只有成功登錄后,且不具有admin角色的用戶才可以看到標簽內的內容,name屬性中只能填寫一個角色的名稱
- shiro:notAuthenticated (表示沒有通過驗證)
1 <shiro:notAuthenticated> 2 <label>用戶身份驗證沒有通過(包括通過記住我(remember me)登錄的) </label> 3 </shiro:notAuthenticated>
說明:只有沒有通過驗證的才可以看到標簽內的內容,包括通過記住我(remember me)登錄的
- shiro:principal (表示用戶的身份)
- 取值取的是你登錄的時候,在Realm 實現類中的new SimpleAuthenticationInfo(第一個參數,....) 放的第一個參數:
.... return new SimpleAuthenticationInfo(user,user.getPswd(), getName());
- 1)如果第一個放的是username或者是一個值 ,那么就可以直接用。
<!--取到username--> <shiro: principal/>
- 2)如果第一個參數放的是對象,比如放User 對象。那么如果要取其中某一個值,可以通過property屬性來指定。
<!--需要指定property--> <shiro:principal property="username"/>
- 取值取的是你登錄的時候,在Realm 實現類中的new SimpleAuthenticationInfo(第一個參數,....) 放的第一個參數:
- shiro:user (表示已登錄)
1 <shiro:user> 2 <label>歡迎[<shiro:principal/>],</label><a href="/logout.jsp">退出</a> 3 </shiro:user>
說明:只有已經登錄(包含通過記住我(remember me)登錄的)的用戶才可以看到標簽內的內容;一般和標簽shiro:principal一起用,來做顯示用戶的名稱
-
注意:
shiro的jsp標簽可以嵌套使用,可以根據業務的具體場景進行使用。例如一個按鈕需要排除不是admin或user角色的用戶才可以顯示,可以像如下這樣實現:
1 <shiro:lacksRole name="admin"> 2 <shiro:lacksRole name="user"> 3 <label>這個用戶不擁有admin或user的角色</label> 4 </shiro:lacksRole> 5 </shiro:lacksRole>
權限注解:
- shiro提供了相應的注解用於權限控制,如果使用這些注解就需要使用aop的功能來進行判斷。shiro提供了spring aop集成,用於權限注解的解析和驗證
- shiro注解權限控制-5個權限注解
-
@RequiresAuthentication:
使用該注解標注的類,實例,方法在訪問或調用時,當前Subject必須通過login 進行了身份驗證;即 Subject.isAuthenticated() 返回 true
-
@RequiresUser:
表示當前 Subject 已經身份驗證或者通過記住我登錄的,才能訪問或調用被該注解標注的類,實例,方法。
-
@RequiresGuest:
使用該注解標注的類,實例,方法在訪問或調用時,當前Subject可以是“gust”身份,不需要經過身份驗證或通過記住我登錄過,即是游客身份。
-
@RequiresRoles:
當前Subject必須擁有所有指定的角色時,才能訪問被該注解標注的方法。如果當前Subject不同時擁有所有指定角色,則方法不會執行還會拋出AuthorizationException異常。
如:@RequiresRoles(value={“admin”, “user”}, logical= Logical.AND): 表示當前 Subject需要角色 admin 和user
-
@RequiresPermissions:
當前Subject需要擁有某些特定的權限時,才能執行被該注解標注的方法。如果當前Subject不具有這樣的權限,則方法不會被執行。
如:@RequiresPermissions (value={“user:a”, “user:b”}, logical= Logical.OR):表示當前 Subject 需要權限 user:a 或user:b
-
- 使用方法:
-
Shiro的認證注解處理是有內定的處理順序的,如果有個多個注解的話,前面的通過了會繼續檢查后面的,若不通過則直接返回,處理順序依次為(與實際聲明順序無關):
RequiresRoles
RequiresPermissions
RequiresAuthentication
RequiresUser
RequiresGuest例如:你同時聲明了RequiresRoles和RequiresPermissions,那就要求擁有此角色的同時還得擁有相應的權限。
- RequiresRoles的使用
可以用在Controller或者方法上。可以多個roles,多個roles時默認邏輯為 AND也就是所有具備所有role才能訪問。1 //屬於user角色 2 @RequiresRoles("user") 3 4 //必須同時屬於user和admin角色 5 @RequiresRoles({"user","admin"}) 6 7 //屬於user或者admin之一;修改logical為OR 即可 8 @RequiresRoles(value={"user","admin"},logical=Logical.OR)
- RequiresPermissions的使用
與 RequiresRoles類似1 //符合index:hello權限要求 2 @RequiresPermissions("index:hello") 3 4 //必須同時復核index:hello和index:world權限要求 5 @RequiresPermissions({"index:hello","index:world"}) 6 7 //符合index:hello或index:world權限要求即可 8 @RequiresPermissions(value={"index:hello","index:world"},logical=Logical.OR)
- RequiresAuthentication,RequiresUser,RequiresGuest的使用
這三個的使用方法一樣:@RequiresAuthentication @RequiresUser @RequiresGusst
注:Shiro依賴於slf4j,commons-beanutils,commons-logging三個jar包。
- RequiresRoles的使用
-