shiroFilter配置详解

本文详细介绍了Shiro权限控制的配置方式,包括基于URL的权限控制、自定义Shiro Filter及其配置方法,并提供了角色判断Filter的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Shiros是我们开发中常用的用来实现权限控制的一种工具包,它主要有认证、授权、加密、会话管理、与Web集成、缓存等功能。

Shiro  权限配置一般使用的有两种,一种是采用注解的方式,在我们的  Controller  方法上,或者Action 方法上写入一些权限判断注解,具体怎么使用,我不做介绍,我主要推荐使用配置的方式。这也是我们现在要讲到的配置方式加载系统基础权限控制,采用对Url 进行控制。

一、Shiro配置文件配置方式

  1. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  2. <property name="securityManager" ref="securityManager" />
  3. <property name="loginUrl" value="/u/login.shtml" />
  4. <property name="successUrl" value="/" />
  5. <property name="unauthorizedUrl" value="/?login" />
  6. <!-- 基本系统级别权限配置-->
  7. <property name="filterChainDefinitions" >
  8. <value>
  9. /page/login.jsp = anon <!-- 登录相关不拦截 -->
  10. /page/register/* = anon
  11. /page/index.jsp = authc
  12. /page/addItem* = authc,roles[数据管理员]
  13. /page/file* = authc,roleOR[普通用户,数据管理员]
  14. /page/listItems* = authc,roleOR[数据管理员,普通用户]
  15. /page/showItem* = authc,roleOR[数据管理员,普通用户]
  16. /page/updateItem*=authc,roles[数据管理员]
  17. /** = anon <!-- 其他不拦截 -->
  18. </value>
  19. </property>
  20. <!-- 自定义shiro 的 Filter -->
  21. <property name="filters">
  22. <util:map>
  23. <entry key="login" value-ref="login"></entry>
  24. </util:map>
  25. </property>
  26. </bean>

主要看上面的 filterChainDefinitions 部分,这里是配置我们的的url 和对应的Filter 关系配置。

重要:这里的加载顺序是自上而下,所以看到我们/** 写到最后,因为匹配不中最后都让这个匹配中。后面我们会讲到采用配置文件加载怎么有序加载。

二、Shiro filterChainDefinitions 中配置讲解

栗子1,带参数配置方式:

  1. /admin/ask/editor.shtml = role[2008,2009]

上面配置的意义:就是在请求/admin/ask/editor.shtml 链接时候进入别名为 role 的Shiro Filter ,并且参数为数组[2008,2009] ,这里参数的意思是角色编号。具体这个参数怎么取,最下面的 5.2 点看代码。

栗子2,简单配置方式:

  1. /admin/ask/editor.shtml = role

上面的配置意义: 就是在请求/admin/ask/editor.shtml 链接时候进入别名为 role 的Shiro Filter

栗子3,多个Shiro Filter配置方式:

  1. /admin/ask/editor.shtml = login,role[2008,2009]

上面配置意义: 就是在请求/admin/ask/editor.shtml 链接时候先进入 别名为 login 的Filter ,并且无参数。别名为login 的Filter 如果没通过,就不会走别名为role 的Filter ,如果别名为login 的Filter返回true ,则进入别名为role 的Filter 。也就是从前到后。

这样的场景是很正常的业务场景,就是先判断登录,再判断角色权限。

栗子4,Shiro Filter的执行顺序:

记住这句话, “ 自上而下,从左到右” 即可。如下代码:

  1. /admin/ask/editor.shtml = login,role[2008,2009]
  2. /admin/ask/** = login,role[007]

如果来了一个链接为“/admin/ask/update.shtml ” ,先对比 /admin/ask/editor.shtml 是否匹配,如果匹配不中再走下面的通配/admin/ask/**  匹配中了后,再执行 login Filter ,然后通过login Filter 后再执行 role[007] Filter 。

所以记住一点,权限为金字塔状,先精确匹配或是权限稍小在前面,权限大(模糊匹配)的在后面。具体可以看栗子5.

栗子5,通配(模糊匹配):

  1. /admin/ask/** = login,role[007]
  2. /admin/** = login,role[008]
  3. /** = login

上面是一个典型的金字塔式匹配方式,/** 是匹配所有,也就是如果上面的/admin/ask/**  和/admin/** 都匹配不中的时候,才走 /** = login 。如果反过来配置,如下:

  1. /** = login
  2. /admin/** = login,role[008]
  3. /admin/ask/** = login,role[007]

这样配置的话,全部都走 /** = login了,下面的2个不可能会走。再看下面:

  1. /admin/** = login,role[008]
  2. /admin/ask/** = login,role[007]
  3. /** = login

这样配置的话,那就永远都不会走 /admin/ask/**,因为都给 /admin/** 拦截了。

三、Shiro 的默认Filter 对应的类

 Filter名称 类路径(点击可以进入官方介绍,强烈建议看看 )
 anon org.apache.shiro.web.filter.authc.AnonymousFilter
 authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter
 authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
 logout org.apache.shiro.web.filter.authc.LogoutFilter
 noSessionCreation org.apache.shiro.web.filter.session.NoSessionCreationFilter
 perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
 port org.apache.shiro.web.filter.authz.PortFilter
 rest org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
 roles org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
 ssl org.apache.shiro.web.filter.authz.SslFilter
 user org.apache.shiro.web.filter.authc.UserFilter

四、自定义Shiro Filter 配置

定义Shiro Filter bean ,在  Spring  相关配置文件中配置。

  1. <!-- 自定义Filter bean-->
  2. <bean id="login" class="com.sojson.core.shiro.filter.LoginFilter">
  3. <property name="customShiroSessionDAO" ref="customShiroSessionDAO"/>
  4. </bean>
  5. <bean id="role" class="com.sojson.core.shiro.filter.RoleFilter"/>
  6. <bean id="permission" class="com.sojson.core.shiro.filter.PermissionFilter"/>
  7. <bean id="simple" class="com.sojson.core.shiro.filter.SimpleAuthFilter"/>

定义Shiro Filter Bean  对应关系。

  1. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  2.     <!-- 省略配置,参考上面的代码 -->
  3. <!-- 自定义shiro 的 Filter -->
  4. <property name="filters">
  5. <util:map>
  6. <!-- key 定义 Filter的别名,而 value-ref 对应上面bean的id -->
  7. <entry key="login" value-ref="login"></entry>
  8. <entry key="role" value-ref="role"></entry>
  9. <entry key="simple" value-ref="simple"></entry>
  10. <entry key="permission" value-ref="permission"></entry>
  11. <entry key="kickout" value-ref="kickoutSessionFilter"></entry>
  12. </util:map>
  13. </property>
  14. </bean>

这样就配置完成了。

五、自定义Shiro Filter

上面配置了Shiro Filter ,那下面举个栗子,然后以判断角色(role) 的Filter 的代码。

5.1 摘取配置文件中对Filter的配置:

  1. /admin/ask/editor.shtml = role[2008,2009]

解释一下上面代码的意思,就是在请求/admin/ask/editor.shtml 链接时候进入别名为 role 的Shiro Filter ,并且参数为数组[2008,2009] ,这里参数的意思是角色编号。

5.2 Java代码,RoleFilter的定义:

  1. package com.sojson.core.shiro.filter;
  2. import javax.servlet.ServletRequest;
  3. import javax.servlet.ServletResponse;
  4. import javax.servlet.http.HttpServletResponse;
  5. import org.apache.shiro.subject.Subject;
  6. import org.apache.shiro.util.StringUtils;
  7. import org.apache.shiro.web.filter.AccessControlFilter;
  8. import org.apache.shiro.web.util.WebUtils;
  9. /**
  10. *
  11. * 开发公司:SOJSON在线工具 <p>
  12. * 版权所有:© www.sojson.com<p>
  13. * 博客地址:http://www.sojson.com/blog/ <p>
  14. * <p>
  15. *
  16. * 角色判断校验
  17. *
  18. * <p>
  19. *
  20. * 区分 责任人 日期    说明<br/>
  21. * 创建 周柏成 2016年6月2日  <br/>
  22. *
  23. * @author zhou-baicheng
  24. * @email so@sojson.com
  25. * @version 1.0,2016年6月2日 <br/>
  26. *
  27. */
  28. public class RoleFilter extends AccessControlFilter {
  29. static final String LOGIN_URL = "http://www.sojson.com/user/open/toLogin.shtml";
  30. static final String UNAUTHORIZED_URL = "http://www.sojson.com/unauthorized.html";
  31. @Override
  32. protected boolean isAccessAllowed(ServletRequest request,
  33. ServletResponse response, Object mappedValue) throws Exception {
  34. //取到参数[2008,2009] ,强制转换判断。
  35. String[] arra = (String[])mappedValue;
  36. Subject subject = getSubject(request, response);
  37. for (String role : arra) {
  38. //判断是否有拥有当前权限,有则返回true
  39. if(subject.hasRole("role:" + role)){
  40. return true;
  41. }
  42. }
  43. return false;
  44. }
  45. @Override
  46. protected boolean onAccessDenied(ServletRequest request,
  47. ServletResponse response) throws Exception {
  48. Subject subject = getSubject(request, response);
  49. if (subject.getPrincipal() == null) {//表示没有登录,重定向到登录页面
  50. saveRequest(request);
  51. WebUtils.issueRedirect(request, response, LOGIN_URL);
  52. } else {
  53. if (StringUtils.hasText(UNAUTHORIZED_URL)) {//如果有未授权页面跳转过去
  54. WebUtils.issueRedirect(request, response, UNAUTHORIZED_URL);
  55. } else {//否则返回401未授权状态码
  56. WebUtils.toHttp(response).sendError(HttpServletResponse.SC_UNAUTHORIZED);
  57. }
  58. }
  59. return false;
  60. }
  61. }

这样说的很清楚了吧。再有问题加群交流。

原文地址:https://www.sojson.com/blog/199.html

web.xml配置 因为我们是与spring进行集成的,而spring的基本就是web项目的xml文件。所以我们在web.xml中配置shiros的过滤拦截。正常情况下,我们需要将shiro的filter配置在所有的filter前面,当然和encodingFilter这个filter是不区分前后的。因为两者互相不影响的。spring-shiro.xml 这里我们将来看看spring-shiro.xml的配置,这里我采取倒叙的方式讲解,我觉的倒叙更加的有助于我们理解代码。首先我们还记得在web.xml中配置的那个filter吧,名字shiroFilter,对spring-shiro.xml配置文件就是通过这个filter展开的。首先我们在web.xml配置的过滤器实际上是配置ShiroFilterFactoryBean,所以在这里需要将ShiroFilterFactoryBean定义为shiroFilter <!-- Shiro的核心安全接口,这个属性是必须的 --> <!-- 要求登录时的链接(可根据项目的URL进行替换),非必须的属性,默认会自动寻找Web工程根目录下的"/login.html"页面 --> <!-- 登录成功后要跳转的连接 --> <!-- 用户访问未对其授权的资源时,所显示的连接 --> <!-- 若想更明显的测试此属性可以修改它的值,如unauthor.jsp,然后用[玄玉]登录后访问/admin/listUser.jsp就看见浏览器会显示unauthor.jsp --> <!-- Shiro连接约束配置,即过滤链的定义 --> <!-- 此处可配合我的这篇文章来理解各个过滤连的作用http://blog.youkuaiyun.com/jadyer/article/details/12172839 --> <!-- 下面value值的第一个'/'代表的路径是相对于HttpServletRequest.getContextPath()的值来的 --> <!-- anon:它对应的过滤器里面是空的,什么都没做,这里.do和.jsp后面的*表示参数,比方说login.jsp?main这种 --> <!-- authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的一个拦截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter --> /statics/**=anon /login.html=anon /sys/schedule.html=perms[sys:schedule:save] /sys/login=anon /captcha.jpg=anon /**=authc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值