- 一步一步教你用shiro——1引入shiro框架
- 一步一步教你用shiro——2配置并自定义realm
- 一步一步教你用shiro——3配置并自定义sessionManager
- 一步一步教你用shiro——4配置并自定义sessionDao
- 一步一步教你用shiro——5配置rememberMe
- 一步一步教你用shiro——6总结和心得
shiro这个权限框架确实很实用很方便,网上关于它的分析也很多,但是有很多资料都太老了。尚硅谷的视频教程中关于session管理的部分有错误。《一头扎进shiro》是老版本shiro而且太浅了(硬是说session用web容器的就够了,没必要改,敢情你家应用都是单实例的?),慕课网的视频最全面,但是不够细。有很多问题只能自己看源码,做尝试解决。
所以将shiro的一些经验记录下来,希望能帮助到读到本文的你,本文环境shiro1.3.2、spring4.3.5没有使用boot、jdk8、tomcat8.5、mysql5.6、redis3.2.11
目标:通过shiro实现对后端接口进行权限控制,所有静态资源都不需要权限验证,使用redis实现session共享,避免session单点问题
- shiro1.4.0在17年5月份就有了,但是现在shiro官网上还是说1.3.2是最后的稳定版,为了保险,还是用这个老版本
- shiro不推荐使用shiro-all这个总包,可能会造成maven工作不正常,一般常用的是core、spring、web这三个包
<!--工程中单独引入了slf4j,不去除的话jar包冲突-->
<!--可以使用该命令查看jar包是否有冲突,mvn dependency:tree -Dverbose|grep conflict-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.3.2</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
- web.xml中增加spring的代理filter,实际filter是shiro的ShiroFilterFactoryBean(后面说ShiroFilterFactoryBean的具体配置),targetFilterLifecycle为true代表由spring控制该filter的生命周期。
- 一般这段配置不需要改,只需要改url-pattern。shiro源码中的sample配的是/*,因为我只想控制用户访问后端接口的权限,静态资源可以随便访问,所以后端接口都用的api开头,让shiro过滤器只对api开头的请求生效(这样还可以避免频繁访问session,造成redis压力过大的问题,具体后面说)
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/api/*</url-pattern>
</filter-mapping>
- 在spring的配置文件中配置ShiroFilterFactoryBean,注意id一定要和web.xml中 的filter-name一致,否则proxyFilter找不到实际filter。
- shiro的内置过滤器可以百度每个的含义和配制方法,这里需要说下authc。使用authc的接口是一定要输入用户名密码登陆后才能访问,哪怕通过shiro的rememberMe自动登录的用户也需要重新输入用户名密码重新登录后才能访问。
- 就像我们平时访问淘宝,一进网站就自动登录了,但是第一次做敏感操作的时候还是要输入用户名密码登陆进行一次认证,然后再做敏感操作都不需要输入用户名密码了。
<!--配置全局权限过滤器-->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!--shiro最核心组件,具体后面说-->
<property name="securityManager" ref="securityManager"/>
<!--设置没有登录时的跳转地址-->
<property name="loginUrl" value="/static/html/login.html"/>
<!--设置权限不足时的跳转地址-->
<property name="unauthorizedUrl" value="/static/html/noPerm.html"/>
<!--对哪个后端接口使用哪个过滤器进行配置,等号后边是shiro内置过滤器的名字-->
<property name="filterChainDefinitions">
<value>
<!--匿名访问,/api/login是登陆接口,当然可以随便访问-->
/api/login = anon
/api/test? = authc
<!--本工程中上传文件的接口,只允许有common角色的用户访问-->
/api/file = roles[common]
<!--用户退出登录的接口,后端不需要实现该接口,logout拦截到/api/logout的url后,就自动清除登录状态回到首页了-->
<!--因为在web.xml中设置的url-parttern是/api/*,随意只有api开头的url才会被拦截-->
/api/logout = logout
<!--使用自定义拦截器的接口-->
<!--/api/selfFilter = myFilter-->
<!--其他所有接口都需要认证,也就是需要之前输入过账号密码登录过-->
/** = authc
</value>
</property>
<!--加入自定义filter,在filterChainDefinitions可以通过key来引用-->
<!--<property name="filters">-->
<!--<map>-->
<!--<entry key="myFilter">-->
<!--<bean class="MyFilter"/>-->
<!--</entry>-->
<!--</map>-->
<!--</property>-->
</bean>