shiro是一个安全权限框架,使用它我们可以完成认证、授权、加密、会话管理、与 Web 集成、缓存等。
Authentication:身份认证 / 登录,从数据库获取数据,验证用户是不是拥有相应的身份;
Authorization:权限验证(授权),验证已通过认证的用户拥有哪些权限;(根据用户角色,判断用户能做哪些事情。)
Session Manager:会话管理,即用户登录后就是一次会话,在用户没有退出之前,它的所有信息都记录在会话中;
Cryptography:加密模块,对于用户的密码等重要信息加密存储(散列算法,加密算法)
websupport:提供web支持,更好的集成项目环境。
caching:缓存,将登陆后的用户信息存储下来,方便下次查找,提高效率。
Concurrency:shiro 支持多线程应用的并发验证,如在一个线程中开启另一个线程,能把权限自动传播过去;
Testing:提供测试支持;
Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。
以上整个构成shiro的securityManager,shiro的核心部件就是securityManager。
项目代码通过subject与shiro产生交互,所以可以将subject是shiro对外的核心,subject即用户对象。
Subject:用户对象,即所有与shiro产生交互的对象,不一定为用户。
securityManager:shiro的核心,用户认证、授权、加解密均在此完成。
realm:域,Shiro 从从 Realm 获取安全数据(如用户、角色、权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色 / 权限进行验证用户是否能进行操作;可以把 Realm 看成 DataSource,即安全数据源(一个项目可以有多个realm,执行顺序按照配置顺序执行)。
下面就配置shiro,项目采用ssm框架,使用maven管理jar包。
首先在pom.xml下引入shiro的jar包:
接下来配置spring-shiro.xml
首先配置shiro的核心securityManager
接下来配置项目自定义的realm(一个项目可配置多个realm,执行顺序按配置顺序执行,bean的id值对应securityManager中property的ref值)
接下来配置shiro的权限过滤,securityManager:这个属性是必须的。
loginUrl :没有登录的用户请求需要登录的页面时自动跳转到登录页面,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面。
successUrl :登录成功默认跳转页面,不配置则跳转至”/”。如果登陆前点击的一个需要登录的页面,则在登录自动跳转到那个需要登录的页面。不跳转到此。
unauthorizedUrl :没有权限默认跳转的页面。
其权限过滤器及配置释义:
anon:例子/admins/**=anon 没有参数,表示可以匿名使用(无须验证即可访问页面)。
authc:例如/admins/user/**=authc表示需要认证(登录)才能使用,没有参数。(必须认证之后才可以访问的界面)
logout:一般只对应loginOut,用户直接退出
下面配置shiro的缓存(可以使用ehcache或者redis,改配置即可)