一、功能简介
shiro是java的一个安全(权限)框架,不仅可以用于javaSE环境,还可以用于javaEE环境。shiro可以完成认证、授权、加密、会话管理、缓存等功能。
- Authentication:身份认证/登录。
- Authorization:授权,即权限验证。
- Session Manager:会话管理
- Crpytography:加密
- Web Support:Web集成
- Remember Me:记住我
二、shiro架构
shiro框架(从外部看)
- Subject:应用代码直接交互的对象,代表了当前“用户”,这个用户不一定指的是具体的人,与当前应用交互的任何东西都可以是Subject。而且与Subject的所有交互都会委托给SecurityManager,Subject其实就是一个门面,SecurityManager才是真正的执行者。
- SecurityManager:安全管理器,也就是说所有和安全有关的操作都会与它交互。它也是shiro的核心,负责和其他shiro组件的交互。相当于springmvc的DispatcherServlet。
- Realm:shiro从Realm获取安全数据比如角色,权限。如果SecurityManager要验证用户身份,那么就要从Realm获取相应的用户进行比较,确定用户身份是否合法。可以把Realm看成datasource。
shiro框架(从内部看)
- Subject:任何可以与应用交互的“用户“。
- SecurityManager:相当于SpringMVC的DispatcherServlet,核心。
- Authenticator:负责Subject的认证,可以自定义实现。包含多种认证策略。
- Authorizer:授权器,也就是访问控制器。控制用户能访问应用中的哪些功能。
- Realm:可以认为是安全实体数据源,获取安全实体,可以有一个或者多个。
- SessionManager:管理Session生命周期组件。
- CacheManager:缓存控制器。
- Cryptography:密码模块,提供加密组件。
三、集成
与Spring集成
- 加入Spring好Shiro的jar包。
- 配置Spring和SpringMVC。
- 参照1.3.2\shiro-root-1.3.2-source-release\shiro-root-1.3.2\samples\spring配置web.xml和Spring配置文件。
与web集成
- shiro提供了与web集成的支持,其通过一个shiroFilter入口拦截需要控制的url,然后进行相应的权限控制。
- shiroFilter类似于springmvc中的前端控制器,是安全控制的入口点,负责读取配置文件,比如ini配置文件,然后判断url是否需要登录/权限等工作。
四、shiroFilter
下面看shiroFilter在web.xml中的配置:
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>tartgetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattren>*</url-pattern>
</filter-mapping>
DelegatingFilterProxy的作用就是自动到spring的容器中,查找名字为shiroFilter(filter-name)的bean,并将所有filter的操作委托给spring的容器中的bean。
shiro默认的过滤器
- anon:没有参数,表示可以匿名使用。例子:/admin/**=anon
- authc:没有参数,表四需要认证(登录)才能使用。例子:/user/**=authc
- roles:角色过滤器,判断当前用户是否拥有指定角色。例子:admins/**=roles[“admin,guest”]
url匹配模式(使用Ant风格模式)
Ant路径通配符支持?、*、**,注意通配符匹配不包括目录分隔符"/"
- ?:匹配一个字符,比如/admin?将匹配/admin1,但是不匹配/admin或者/admin/
- *:匹配0个或者多个字符串,比如/admin*将匹配/admin或者/admin123,但是不匹配/admin/1
- **:匹配路径中的0个或者多个路径,比如/admin/**将匹配/admin/a或者/admin/a/s
url匹配顺序
url匹配顺序按照第一次匹配优先原则,即从头开始选择第一个能匹配上的拦截器链。
比如:
/admin/**=filter1
/admin/user=filter2
/**=filter3
如果请求的是/admin/user,将使用filter1拦截。