前段时间研究了一下shiro,因为看不懂英文所以学习过程颇为曲折,后来整合shiro想写一个sso结果这段时间又写不下去了只好来写写博客了。
最初学shiro是在百度搜教程,说实话那些教程除了开涛写的其它人写的确实不怎么样,而且开涛的教程也不是特别详细的那种,所以我在这给大家写一个整合后的完整教程。
shiro的设计思想我在这就不多说了,实话我说只明白一小半甚至一小半都没有,要说思想开涛的博客的前几章讲的很好,所以我在这不重复了这里我只讲些实用的东西能让你快速上手的。
先上个Spring mvc的配置文件,具体都是什么配置请自行百度这个教程太多了我在这就不讲了。
Spring公共配置
classpath*:/application.properties
classpath*:/config/shiro.properties
下面这个是重点shiro的spring配置:
从上到下依次给大家讲解。
1、shiroDbRealm:这是一个自定义的realm,realm的作用我的理解就是用来给用户登陆和设置权限的。具体讲解请看第二章。
2、securityManager:安全管理器,从它的注入属性来看,他管理着用户的realm、session、cache,我的理解是可以将他看作是一个中心,所有的操作都要经过它的调度。
3、sessionValidationScheduler:他是shiro自己的一个session管理器,从源码可以看出它其实就是一个线程,这个东西不需要手动注入,这里列出来是因为我觉得默认30分钟一次的刷新频率太低了,当初想通过这种方式来改掉他的默认时间,大家从我只写了一行代码可以看出结果当然是失败的。
4、sessionManager:这是对session所有操作的一个管理类。
5、sharsession:用来设置当前会话的cookie设置,属性包括cookie所的属性。
6、shiroCacheMnanager:chche管理器,这里面是一个单机版的管理器,如果是集群据说要重写sessionDAO这个组件,具体的没有研究过,过后再研究一下。
7、chainDefinitionSectionMetaSource:这个是我自己写资源加载器,大家都知道shiro的标准配置方式是在xml里面配置资源地址而在xml里面配置地址会有很多的不便,经过研究最终写出了通过项目启动时访问数据库来加载地址的方式。具体的实现方式在后面会讲到。
8、shiroFilter:这是shiro拦截器的入口位置,用来初始化所有需要的组件及参数。
9、lifecycleBeanPostProcessor:说实话不知道这是干嘛的,看注释意思是使用注解来控制权限。
下面是web.xml的一个设置:
member
contextConfigLocation
classpath*:/applicationContext*.xml
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encodingFilter
/*
org.springframework.web.context.ContextLoaderListener
org.springframework.web.util.IntrospectorCleanupListener
shiroFilter
org.springframework.web.filter.DelegatingFilterProxy
targetFilterLifecycle
true
shiroFilter
/*
appServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:/springmvc-servlet.xml
1
appServlet
/
前半部分是对编码的一个设置,中间部分是shiro的设置,在这里要说一下shiro拦截器的加载方法与普通拦截器不一样具体原理没明白但有一点filter-name必须要与xml里面定义的bean id一样否则会报错。在shiro的后面就是spring自己的配置了跟正常的一样没什么好说的。
在这要说一句,shiro里面接管了session默认的应该是30分钟,如果在这里设置的话应该就不起作用了需要在shiro的配置项里面去设置globalSessionTimeOut。