Shiro過濾器、標簽和權限注解


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"/>
    • 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包。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM