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);
```