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(第一个参数,....) 放的第一个参数:
        1
        2
        ....
        return new SimpleAuthenticationInfo(user,user.getPswd(), getName());
      • 1)如果第一个放的是username或者是一个值 ,那么就可以直接用。
        1
        2
        <!--取到username-->
        <shiro: principal/>
      • 2)如果第一个参数放的是对象,比如放User 对象。那么如果要取其中某一个值,可以通过property属性来指定。
        1
        2
        <!--需要指定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包。

posted @   zhgking  阅读(1589)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示