1、Shiro简介
Shiro是专门一个权限以及认证授权的处理验证框架,它的主要功能是进行用户登录检测以及授权认证处理的操作开发框架。Shiro是有Apache推广的一个开源项目。“http://shiro.apache.org/”
Shiro主要功能:Primary Concerns(核心利益)
* Authentcation(身份验证) :登录验证用户是不是拥有相应的身份。
* Authorization(授权认证):验证某个已经认证的用户是否拥有某个权限。
* SessionManagement(会话管理) :用户登录后就是一次会话,没有退出之前,它的所有信息都保存在会话中,会话可以是JavaSE环境,也可以是Web环境。
* Cryptography(加密):保护数据的安全性,如密码加密存储到数据库中,而不是明文储存。
Shiro工作流程:
* ApplicationCode(应用代码) —》 Subject(主题) —》 Shiro SecurityManager(安全管理人员)
—》 Realm(域):Shiro从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm得到用户进行比较,以确定用户身份是否合法,也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。
1、Subject:应用在代码直接交互的对象是Subject,所有Subject都绑定到SecurityManager,可以把Subject认为是一个门面;SecurityManager才是实际的执行者;
2、SecurityManager:安全管理器,所有的安全有关的操作都会与SecurityManager交互,且他管理这个有Subject;可以看出的是Shiro的核心,他负责与后边介绍的其他组件进行交互,如果学习过SpringMVC,你可以把它看成DispatcherServlet前端控制器.
3、Realm:域,Shiro从Realm获取安全数据(如用户,角色,权限),就是说SecurityManager要验证用户身份,那么他需要从Realm获取相应的用户进行比较以确定用户身份是否合法,也需要从Realm得到用户形影的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,(表示安全数据源)。
Shiro只是提供有一个用户登录、授权认证的处理开发框架,它可以对所有的项目进行统一的授权处理操作。
2、基础身份验证
在Shiro里面用户需要为其提供两个内容:principals(身份)、credentials(证明):
* principals:描述的是用户输入的标识名称,例如:用户名,手机,邮箱等,这个唯一标识,
* credentials:需要知道认证主体的信息,例如:密码,安全证书。
如果想进行文本认证资源(shiro.ini)的信息加载那么必须依靠:org.apache.shiro.util.Factory
* 取得SescurityManager 接口对象:public T getInstance() ;
* 资源文件取得:IniSecurityManagerFactory子类为Factory接口对象实例化:
3、认识Realm
为了统一数据的来源处理,准备了一个Realm接口。
//要求返回一个当前使用的Realm名字,这个名字可以任意返回。
* public String getName() ;
//判断你当前使用的Token的类型是否为指定的类型;
* public boolean supports(AuthenticationToken token) ;
//得到用户的认证信息,根据传入的Token取得
//token包含了要进行数据验证的所有数据
* public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token)
4、固定信息Realm认证
如果要使用Realm操作,那么必须要有一个具体的认证类实现了Realm接口。
认证信息:AuthenticationInfo接口有连个方法:
* 取得所有的身份信息:public PrincipalCollection getPrincipals() ;
* 取得认证信息:public Object getCredentials()。
子类:SimpleAuthenticationInfo;
* 构造方法:public SimpleAuthenticationInfo(Ojbect principal,Object credentials,String realmName)。
所有用户的信息都保存在token里面:AuthenticationToken接口有两个方法:
* 身份数据:public Object getPrincipal() ;
* 认证数据:public Object getCredentials() ;
|-次数返回的数据为char[]数组,不直接转换为String;
5、认证授权
授权也称为访问控制,即:末一个资源库中的那些资源允许当前用户来进行访问,而在整个的授权之中包含以下几个概念:授权主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。
固定角色操作值得是直接利用配置文件实现。该实现要求在[users]下进行,而且配置的形式为:“用户名=密码,角色,角色...”。
1、角色检测在shiro之中Subject接口秘书的是用户的主题信息,所以针对于角色的认证处理都在此接口中提供,方法如下:
Public void checkRole(String roleIdentifier)throw AuthorizationException 检测一个角色是否存在 |
Public void checkRoles(String... roleIdentifiers) 检测所个角色是否存在 |
Public boolean hasRole(String roleIdentifier) 判断是否有指定的角色 |
Public boolean hasAllRoles(Collection |
2、权限的判断处理依然在Subject接口之中完成,再次接口定义有如下方法:
Public void checkPermission(String permission) 检测权限是否存在,如果不存在抛出异常 |
Public void checkPermissions(String.. Permissions) 检测是否含有指定的所有权限,不存在抛出异常 |
Public boolean isPermitted(String permission) 判断是否有指定的一个权限 |
Public boolean isPermittedAll(String... Permissions)判断是否有指定的多个权限 |
6、权限认证
可以取得了角色数据,那么就意味着可以进行权限的取得,那么基本关系就是,一个角色对应有多个权限。
1、想要进行角色中所包含的权限的配置,那么可以直接在shiro.ini文件里面定义;
* 用户和角色:“用户名=密码,角色,角色,角色.....”
* 用户和权限:“角色=权限,权限......”。
2、对于权限的判断处理依然在Subject接口之中完成,再此接口里面定义有如下权限认证方法:
Public void checkPermission(String permission) 检测权限是否存在,如果不存在抛出异常 |
Public void checkPermissions(String... Permissions) 检测是否包含有指定的所有权限,不存在抛出异常, |
Public boolean isPermitted(String permission) 判断是否有指定的一个权限 |
Public booelan isPermittedAll(String... Permissions) 判断是否有指定的多个权限 |
3、
7、在WEB中使用Shiro
Shiro过滤器过滤属性含义:
* securityManager(安全管理):这个属性是必须的。
* loginUrl:没有登录的用户请求需要登录的页面是自动跳转到登录页面,不是必须属性,不输入地址的话会自动寻找项目WEB项目的根目录下,的“/login.jsp”页面。
* successUrl:登录成功默认跳转页面,不配置则跳转至“/”。如果登录前点击登录页面,则在登录自动跳转到那个需要登录的页面。
* unauthorizedUrl(非法路径):没有权限默认跳转的页面。
权限过滤器及配置释义
* anon:例子/admin/**=annon 表示登录页面不需要进行检测处理。
* authc:表示需要认证(登录)才能使用,没有参数。
* roles:认证失败跳转页面。参数可以写多个,多个是必须加上引号,参数之间都好分割。
* perms(权限):例子/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。
* rest(休止符):例子/admin/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method],其中method为post,get,delete等。
* authBasic:例如/admin/user/**=authcBasic没有参数表示httpBasic
* ssl:例子/admin/user/**=ssl没有参数,表示安全url请求,协议为https
User:例如/admin/user/**=user没有参数表示必须存在用户,当登录操作是不做检查。
注:anon,authcBasic,auchc,user是认证过滤器,
perms , roles , ssl , rest , port 是授权过滤器
路径通配符:
* “?”:匹配任意的一个字符,
*“*”:匹配一个过多个任意的字符,例如“/admin*”,可以匹配“/admin123”、“/admin”;
* “**”:匹配零个或多个目录,
8、Shiro标签支持
1、<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags"%>
2、在Shiro里面提供有如下的标签内容:
* 取得用户名:
如果想要在Servlet里面如的用户名:SecurityUtils.getSubject().getPrincipal();
* 是否具备有指定角色: