springrain技术详解(1)
展开全文
shiro是一个非常强大灵活的权限控制框架,属于apache的顶级项目.springrain使用shiro实现了权限控制功能.
下图充分说明了shiro的体系架构
归根到底,权限控制无非是利用过滤器控制访问的认证和授权,shiro也不例外.我们来看看shiro是怎么实现的吧.
要在web中使用shiro,总共分三步:
第一步:在l中配置shiro的过滤器,建议是应用的第一个过滤器,springrain示例配置如下:
01
<filter>
02
<filter-name>shiroFilter</filter-name>
03
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
04
<init-param>
05
<param-name>targetFilterLifecycle</param-name>
06
<param-value>true</param-value>
07
</init-param>
08
</filter>
09
<filter-mapping>
10
<filter-name>shiroFilter</filter-name>
11
<url-pattern>/*</url-pattern>
12
<dispatcher>REQUEST</dispatcher>
13
<dispatcher>FORWARD</dispatcher>
14
<dispatcher>INCLUDE</dispatcher>
15
<dispatcher>ERROR</dispatcher>
16
</filter-mapping>
这个shiroFilter其实是个spring bean,等下会重点说这个bean,dispatcher这个标签是为了在forward和redirect的情况下也需要经过过滤器
第二步:配置spring-shiro,springrain配置是l
01
02
<bean id="securityManager" class="org.apache.DefaultWebSecurityManager">
03
04
<property name="realm" ref="shiroDbRealm" />
05
06
<property name="sessionManager" ref="sessionManager" />
07
08
<property name="cacheManager" ref="shiroCacheManager" />
09
</bean>
10
11
<bean id="sessionManager" class="org.apache.shiro.DefaultWebSessionManager">
12
13
<property name="globalSessionTimeout" value="1800000"/>
14
15
<property name="sessionDAO" ref="shiroSessionDao"/>
16
17
<property name="sessionIdCookie" ref="sharesession"/>
18
19
<property name="sessionValidationSchedulerEnabled" value="true" />
20
</bean>
21
 
22
23
<bean id="sharesession" class="org.apache.shiro.web.servlet.SimpleCookie">
24
25
<constructor-arg name="name" value="SHAREJSESSIONID"/>
26
</bean>
27
28
<bean id="shiroSessionDao" class="org.apache.is.EnterpriseCacheSessionDAO" />
29
 
30
31
<bean id="shiroCacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager" />
32
 
33
34
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"
35
depends-on="frameperms">
36
37
<property name="securityManager" ref="securityManager" />
38
39
<property name="loginUrl" value="/login" />
40
41
<property name="successUrl" value="/index" />
42
43
<property name="unauthorizedUrl" value="/unauth" />
44
45
<property name="filterChainDefinitions">
46
<value>
47
/js/** = anon
48
/css/** = anon
49
/images/** = anon
50
/myimg/**= anon
51
/unauth = anon
52
/getCaptcha=anon
53
/login = anon
54
/favicon.ico = anon
55
/index = user
56
/logout = logout
jsessionid
57
/menu/leftMenu=user
58
/**/ajax/** = user
59
/** = user,frameperms
60
</value>
61
</property>
62
63
<property name="filters">
64
<map>
65
<entry key="frameperms" value-ref="frameperms"></entry>
66
</map>
67
</property>
68
</bean>
69
70
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
frameperms是自定义的过滤器,除了那些特殊url,其他的菜单都在数据库,查询用户权限判断,下一篇文章介绍下权限相关的表结构.
另外不建议在web项目使用类似 admin:user:edit这种方式控制权限,这种方式等同给url又起了一个别名,这样虽然看起来比较容易理解,但是相当死板和麻烦.建议直接使用url判断权限
authc 和 user的区别是 user包含 rememberme,authc不包含,就这一点区别.
第三步:实现数据库认证和权限过滤
数据库认证shiroDbRealm的代码:
git.oschina/chunanyong/springrain/blob/master/springrain/src/org/springrain/frame/shiro/ShiroDbRealm.java
自定义权限过滤frameperms的代码:
git.oschina/chunanyong/springrain/blob/master/springrain/src/org/springrain/frame/shiro/FramePermissionsAuthorizationFilter.java
另外 springrain 没有使用authc实现登陆,而是使用一个普通的controller方法进行登陆
org.ller.BaseController.loginPost(User, HttpSession, Model, HttpServletRequest)
其中
//会调用 shiroDbRealm 的认证方法
//org.springrain.frame.shiro.ShiroDbRealm.doGetAuthenticationInfo(AuthenticationToken)
user.login(token);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。