springrain技术详解(1)-shiro基本权限控制

作者: admin  分类: shirospringspringrain  发布时间: 2013-12-10 10:07  ė23 浏览数  62条评论

shiro是一个非常强大灵活的权限控制框架,属于apache的顶级项目.springrain使用shiro实现了权限控制功能.

 

下图充分说明了shiro的体系架构

归根到底,权限控制无非是利用过滤器控制访问的认证和授权,shiro也不例外.我们来看看shiro是怎么实现的吧.

要在web中使用shiro,总共分三步:

第一步:在web.xml中配置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配置是applicationContext-shiro.xml

01 <!-- 权限管理器 -->
02 <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
03 <!-- 数据库认证的实现 org.springrain.frame.shiro.ShiroDbRealm -->
04 <property name="realm" ref="shiroDbRealm" />
05 <!-- session 管理器 -->
06 <property name="sessionManager" ref="sessionManager" />
07 <!-- 缓存管理器 -->
08 <property name="cacheManager" ref="shiroCacheManager" />
09 </bean>
10 <!-- session管理器 -->
11 <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
12 <!-- 超时时间 -->
13 <property name="globalSessionTimeout" value="1800000"/>
14 <!-- session存储的实现 -->
15 <property name="sessionDAO" ref="shiroSessionDao"/>
16 <!-- sessionIdCookie的实现,用于重写覆盖容器默认的JSESSIONID -->
17 <property name="sessionIdCookie" ref="sharesession"/>
18 <!-- 定时检查失效的session -->
19 <property name="sessionValidationSchedulerEnabled" value="true" />
20 </bean>
21  
22 <!-- sessionIdCookie的实现,用于重写覆盖容器默认的JSESSIONID -->
23 <bean id="sharesession" class="org.apache.shiro.web.servlet.SimpleCookie">
24 <!-- cookie的name,对应的默认是 JSESSIONID -->
25 <constructor-arg name="name" value="SHAREJSESSIONID"/>
26 </bean>
27 <!-- session存储的实现 -->
28 <bean id="shiroSessionDao" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO" />
29  
30 <!-- 缓存管理实现 -->
31 <bean id="shiroCacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager" />
32  
33 <!-- shiro的主过滤器,beanId 和web.xml中配置的filter name需要保持一致 -->
34 <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"
35 depends-on="frameperms">
36 <!-- 安全管理器 -->
37 <property name="securityManager" ref="securityManager" />
38 <!-- 默认的登陆访问url -->
39 <property name="loginUrl" value="/login" />
40 <!-- 登陆成功后跳转的url -->
41 <property name="successUrl" value="/index" />
42 <!-- 没有权限跳转的url -->
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
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 <!-- 起效权限注解,这个很少在web项目中用到,一般是控制url的访问,不是在controller中声明权限注解 -->
70 <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />

frameperms是自定义的过滤器,除了那些特殊url,其他的菜单都在数据库,查询用户权限判断,下一篇文章介绍下权限相关的表结构.
另外不建议在web项目使用类似 admin:user:edit这种方式控制权限,这种方式等同给url又起了一个别名,这样虽然看起来比较容易理解,但是相当死板和麻烦.建议直接使用url判断权限
authc 和 user的区别是 user包含 rememberme,authc不包含,就这一点区别.

第三步:实现数据库认证和权限过滤

数据库认证shiroDbRealm的代码:

http://git.oschina.net/chunanyong/springrain/blob/master/springrain/src/org/springrain/frame/shiro/ShiroDbRealm.java

自定义权限过滤frameperms的代码:

http://git.oschina.net/chunanyong/springrain/blob/master/springrain/src/org/springrain/frame/shiro/FramePermissionsAuthorizationFilter.java

另外 springrain 没有使用authc实现登陆,而是使用一个普通的controller方法进行登陆
org.springrain.frame.controller.BaseController.loginPost(User, HttpSession, Model, HttpServletRequest)
其中
//会调用 shiroDbRealm 的认证方法
//org.springrain.frame.shiro.ShiroDbRealm.doGetAuthenticationInfo(AuthenticationToken)
user.login(token);

本文出自 9iu.org,转载时请注明出处及相应链接。

本文永久链接: http://www.9iu.org/2013/12/10/springrain1-shiro.html

0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值