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(第一个参数,....) 放的第一个参数:
12
....
return
new
SimpleAuthenticationInfo(user,user.getPswd(), getName());
- 1)如果第一个放的是username或者是一个值 ,那么就可以直接用。
12
<!--取到username-->
<
shiro:
principal/>
- 2)如果第一个参数放的是对象,比如放User 对象。那么如果要取其中某一个值,可以通过property属性来指定。
12
<!--需要指定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的使用
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具