1 Shiro简介
1.1 Shiro介绍
Apache Shiro是一个强大且易用的Java安全框架,有身份验证
、授权
、密码学
和会话管理
。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
Spring security 重量级
安全框架
Apache Shiro轻量级
安全框架
1.2 Shiro功能
Shiro 开发团队称为“应用程序的四大基石” ——身份验证,授权,会话管理和加密作为其目标
Authentication(身份认证):这是一个证明用户是他们所说的他们是谁的行为
Authorization(授权):访问控制的过程,也就是绝对“谁”去访问“什么”权限
Session Management:管理用户特定的会话,即使在非 Web 或 EJB 应用程序。
Cryptography:通过使用加密算法保持数据安全同时易于使用。
Web Support: Shiro 的 web 支持的 API 能够轻松地帮助保护 Web 应用程序。
Caching:缓存是 Apache Shiro 中的第一层公民,来确保安全操作快速而又高效。
Concurrency: Apache Shiro 利用它的并发特性来支持多线程应用程序。
Testing:测试支持的存在来帮助你编写单元测试和集成测试,并确保你的能够如预期的一样安全。
“Run As”:一个允许用户假设为另一个用户身份(如果允许)的功能,有时候在管理脚本很有用。
“Remember Me”:在会话中记住用户的身份,所以他们只需要在强制时候登录。
2 Shiro入门
2.1 配置shiro.ini模式
导包
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
测试 底层默认找IniRealm
2.2 自定义的Realm的模式
//自定义Realm
public class MyRealm extends AuthorizingRealm {
//授权
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//得到主体 --用户名
String primaryPrincipal = (String) principalCollection.getPrimaryPrincipal();
//根据用户名去拿到权限 -- 从数据库查询
Set<String> roles = getRoleByPrincipal(primaryPrincipal);
//根据用户名去拿到角色 - 从数据库查询
Set<String> permissions = getPermissionByPrincipal(primaryPrincipal);
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
//设置角色
simpleAuthorizationInfo.setRoles(roles);
//设置权限
simpleAuthorizationInfo.setStringPermissions(permissions);
//返回对象
return simpleAuthorizationInfo;
}
//通过用户拿到角色
private Set<String> getRoleByPrincipal(String primaryPrincipal) {
Set<String> roles = new HashSet<String>();
if("haoge".equals(primaryPrincipal)){
roles.add("admin");
return roles;
}else{
return null;
}
}
//通过用户拿到操作的权限
private Set<String> getPermissionByPrincipal(String primaryPrincipal) {
Set<String> permissions = new HashSet<String>();
if("haoge".equals(primaryPrincipal)){
permissions.add("driver:*");
return permissions;
}else{
return null;
}
}
//身份认证
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//得到令牌
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
//主体
Object principal = token.