title: springrain技术详解(1)-shiro基本权限控制 CreateTime: 2013-12-10 10:07:00 UpdateTime: 2013-12-10 10:07:00 CategoryName: web --- --- title: "springrain技术详解(1)-shiro基本权限控制" date: 2013-12-10T10:07:00+08:00 draft: false tags: ["springrain"] categories: ["web"] author: "springrain" --- shiro是一个非常强大灵活的权限控制框架,属于apache的顶级项目.springrain使用shiro实现了权限控制功能. 归根到底,权限控制无非是利用过滤器控制访问的认证和授权,shiro也不例外.我们来看看shiro是怎么实现的吧. 要在web中使用shiro,总共分三步: ## 第一步:在web.xml中配置shiro的过滤器 建议是应用的第一个过滤器,springrain示例配置如下: ```xml shiroFilter org.springframework.web.filter.DelegatingFilterProxy targetFilterLifecycle true shiroFilter /* REQUEST FORWARD INCLUDE ERROR ``` 这个shiroFilter其实是个spring bean,等下会重点说这个bean,dispatcher这个标签是为了在forward和redirect的情况下也需要经过过滤器 ## 第二步:配置spring-shiro springrain配置是applicationContext-shiro.xml ```xml /js/** = anon /css/** = anon /images/** = anon /myimg/**= anon /unauth = anon /getCaptcha=anon /login = anon /favicon.ico = anon /index = user /logout = logout /menu/leftMenu=user /**/ajax/** = user /** = user,frameperms ``` frameperms是自定义的过滤器,除了那些特殊url,其他的菜单都在数据库,查询用户权限判断,下一篇文章介绍下权限相关的表结构. 另外不建议在web项目使用类似 admin:user:edit这种方式控制权限,这种方式等同给url又起了一个别名,这样虽然看起来比较容易理解,但是相当死板和麻烦.建议直接使用url判断权限. authc 和 user的区别是 user包含 rememberme,authc不包含,就这一点区别. ## 第三步:实现数据库认证和权限过滤 [数据库认证shiroDbRealm的代码](https://gitee.com/chunanyong/springrain/blob/SpringRainV4.0.0/src/main/java/org/springrain/frame/shiro/ShiroDbRealm.java) [自定义权限过滤frameperms的代码](https://gitee.com/chunanyong/springrain/blob/SpringRainV4.0.0/src/main/java/org/springrain/frame/shiro/FramePermissionsAuthorizationFilter.java) 另外 springrain 没有使用authc实现登陆,而是使用一个普通的controller方法进行登陆 org.springrain.frame.controller.BaseController.loginPost(User, HttpSession, Model, HttpServletRequest) ```java //会调用 shiroDbRealm 的认证方法 //org.springrain.frame.shiro.ShiroDbRealm.doGetAuthenticationInfo(AuthenticationToken) user.login(token); ```