浅谈shiro权限框架之认证过程
1、什么是shiro框架?
是Apache组织下的一套安全的认证框架,是对用户进行认证和授权,具有会话管理功能。它是一个可以快速完成认证、授权等低成本开发的框架。
优点:使用范围广泛:可以用于B/S:集权分布式和C/S
快速低成本
与同类型Spring security对比:Acegi开源权限管理,非常依赖Spring,使用范围较狭窄、没有shiro框架简单灵活
2、shiro的框架结构
原理:1、用户“登录”,进行用户身份识别(Authentication认证器认证),判断用户是否登陆,如果未登陆,则拦截其请求。
2、当用户登陆后,判断其身份是否有权限访问相应的资源(Authorization授权器授权),如果没有权限则拦截
Subject(主体):使用范围广泛
Security Manager(安全管理器)-核心接口:通过Authenticator对Subjetct认证,通过后用Authorizer授权。
Authenticator(认证器接口)在与Spring整合后对每个request进行主体身份信息认证,判断该主体是否有此功能的操作权限,提供MoudlarRealmAuthenticator实现类,满足大多数的需求,也可以自定义认证器)如果提交的 credentials 跟应用系统中提供的 credentials 吻合,就能够继续访问,否则需要重新提交 principals 和 credentials,或者直接终止访问。
Authorizer(授权器)在访问时判断主体是否有此功能操作权限。
Realm(权限领域):用于存储数据源,主体权限类的数据。若有用户信息,则通过。
Session Manager:会话管理,不依赖于web,可用于单点登录。
SessionDao:dao层的会话接口,可用于jdbc的会话存储在数据库里。
Cache Manager(缓存管理器):将用户权限存储在缓存中
Cryptography:密码管理=对原始密码+随机数字+MD5 x N(次数)
散列算法:将密码散成几乎无法**的密码
所需架包
测试认证模块
1、创建shiro.ini配置文件,可以设置多个组protieties,配置参数初始化的工厂Security Manager
#对用户信息进行配置.ini的好处是可以分组[user1]
[users]
#配置分别为userName=password格式
zhangsan=123456
lisi=65321
2、subject认证登录的请求中需要得到身份信息(AuthenticationToken token)实际开发中一般用AuthenticationToken接口的实现类UsernamePasswordToken 来构建token
@Test
public void testLoginAndLogout(){
//通过外部配置文件.ini,构建SecurityManager工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");
//设置环境得到工厂管理器
SecurityManager securityManager=factory.getInstance();
//用于接收主体请求 单例模式SecurityUtils
SecurityUtils.setSecurityManager(securityManager);
//得到主体:各个请求端
Subject subject=SecurityUtils.getSubject();
//构造subject的token信息
UsernamePasswordToken token=new UsernamePasswordToken("zhangsan","123456");
//执行认证提交
try {
subject.login(token);
} catch (AuthenticationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//对认证状态进行判断
boolean isAuthenticated=subject.isAuthenticated();
System.out.println("是否认证通过"+isAuthenticated);
}
密码错误时,认证失败,抛出异常
Realm通过加载数据库的权限信息来实现认证,将server和mapper层注入到realm即整合SpringMVC的一个入口,继承如图所示的抽象类AuthenticatingRealm
用于初始化安全管理器工厂
MD5加密不靠谱:穷举法来得到账户密码,并不安全