shiro简单的授权
需要引入的依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.3.2</version>
</dependency>
<!-- shiro-core 依赖于这个依赖 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1</version>
</dependency>
1,基本的认证(从配置文件中获取用户和权限信息来模拟从数据库中的获取)
1.1,shiro-resources.ini配置文件的配置
[users]
zhangsan=123,role1
wangwu=123,role2
[roles]
role1=user:create
role2=user:*
1.2,简单的测试代码
/**
* 简单的授权
* @author wangmx
*/
public class TestAuthorize1 {
public static void main(String[] args) {
//简单的授权需要先认证 在授权
//认证
//创建安全管理器
IniSecurityManagerFactory iniSecurityManagerFactory = new IniSecurityManagerFactory("classpath:shiro/shiro-resources.ini");
SecurityManager securityManager = iniSecurityManagerFactory.getInstance();
//告诉安全工具类,使用哪一个安全管理器
SecurityUtils.setSecurityManager(securityManager);
//获取主体
Subject subject = SecurityUtils.getSubject();
//认证状态
boolean flag = subject.isAuthenticated();
System.out.println("认证状态: "+flag);
//认证主体携带数据
AuthenticationToken token = new UsernamePasswordToken("zhangsan", "123");
try {
subject.login(token);
System.out.println("当前认证成功!");
}catch (UnknownAccountException e) {
// TODO: handle exception
System.out.println("账户错误!");
}catch (IncorrectCredentialsException e) {
// TODO: handle exception
System.out.println("密码错误!");
}
flag = subject.isAuthenticated();
System.out.println("认证状态: "+flag);
//授权
if(subject.isAuthenticated()) {
//基于角色权限
//判断当前用户是否有此角色
boolean hasRole1 = subject.hasRole("role1");
if(hasRole1) {
// System.out.println("当前用户有role1的权限");
}
//判断当前用户是否包含某个角色
boolean[] hasRoles2 = subject.hasRoles(Arrays.asList("role1","role2","role3"));
for (boolean b : hasRoles2) {
// System.out.println("判断当前用户是否包含某个角色:"+b);
}
//判断当前用户是否包含所以的角色
boolean hasAllRoles3 = subject.hasAllRoles(Arrays.asList("role1","role2","role3"));
// System.out.println("判断当前用户是否包含所以的角色"+hasAllRoles3);
// 基于权限标识符的权限控制
boolean permitted1 = subject.isPermitted("user:create");
// System.out.println("基于权限标识符的权限控制:"+permitted1);
// 判断用户是否具分别有某个角色
boolean[] permitted2 = subject.isPermitted("user:create:001","user:delete","product:create");
for (boolean b : permitted2) {
// System.out.println("判断用户是否分别具有某个角色:"+b);
}
// 当前用户是否包含所以角色
boolean permittedAll1 = subject.isPermittedAll("user:create:001","user:delete","product:create");
System.out.println("当前用户是否包含所以角色:"+permittedAll1);
}
}
}
2,从数据库中获取用户信息和角色信息(权限标识符)
2.1,还是先看shiro-resources2.ini配置文件的配置,主要就是配置自定义realm和配置安全管理器以及配置凭证匹配器
#配置凭证匹配器
hashedCredentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
hashedCredentialsMatcher.hashAlgorithmName=md5
hashedCredentialsMatcher.hashIterations=1024
#配置自定义realm 自定义realm的地址com.wangmx.shiroAutorizer.PermissionRealm
myrealm=com.wangmx.shiroAutorizer.PermissionRealm
myrealm.credentialsMatcher=$hashedCredentialsMatcher
#配置安全管理器
securityManager.realm=$myrealm
2.2,自定义realm 和只有认证不一样 继承 AuthorizingRealm 实现doGetAuthorizationInfo和doGetAuthenticationInfo方法doGetAuthorizationInfo主要是授权的方法 返回值类型为AuthorizationInfo,doGetAuthenticationInfo是认证的方法返回值为AuthenticationInfo
简单的自定义realm的编写
/**
* 从数据库中查找数据 认证 并且授权
* @author wangmx
*/
public class PermissionRealm extends AuthorizingRealm{
// 授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// TODO Auto-generated method stub
String primaryPrincipal = (String)principals.getPrimaryPrincipal();
System.out.println("授权primaryPrincipal:"+primaryPrincipal);
//查询数据库
//User user = dao.queryUser("primaryPrincipal ");
//dao.queryRole(user.getUserId());
//这里 admin 和 user:add 我没有从数据库中查询 这个可以从数据库中 查询出来
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
//可根据自己需要的去选择 角色还是 权限标识符
//角色
simpleAuthorizationInfo.addRole("admin");
//权限标识符(资源表示)
simpleAuthorizationInfo.addStringPermission("user:add");
return simpleAuthorizationInfo;
}
// 认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
// TODO Auto-generated method stub
String principal = (String)authenticationToken.getPrincipal();
System.out.println("认证Realm:"+principal);
//User user = dao.queryUser("principal");
// wangwu和3d53b73c485f523ef2fe45f2b8dd3c58 可以从user.getUserName()和user.getPassWord()中获取
if(principal.equals("wangwu")) {
return new SimpleAuthenticationInfo("wangwu","3d53b73c485f523ef2fe45f2b8dd3c58",ByteSource.Util.bytes("ABCD"),this.getName());
}
return null;
}
}
2.3,简单的测试代码 进行测试用户的认证和授权模拟 Controller
/**
* 授权 在数据库中取数据
* @author wangmx
*/
public class TestAuthorize2 {
public static void main(String[] args) {
//简单的授权需要先认证 在授权
//认证
//创建安全管理器
IniSecurityManagerFactory iniSecurityManagerFactory = new IniSecurityManagerFactory("classpath:shiro/shiro-resources2.ini");
SecurityManager securityManager = iniSecurityManagerFactory.getInstance();
//告诉安全工具类,使用哪一个安全管理器
SecurityUtils.setSecurityManager(securityManager);
//获取主体
Subject subject = SecurityUtils.getSubject();
//认证状态
boolean flag = subject.isAuthenticated();
System.out.println("认证状态: "+flag);
//认证主体携带数据
AuthenticationToken token = new UsernamePasswordToken("wangwu", "123456");
try {
subject.login(token);
System.out.println("当前认证成功!");
}catch (UnknownAccountException e) {
// TODO: handle exception
System.out.println("账户错误!");
}catch (IncorrectCredentialsException e) {
// TODO: handle exception
System.out.println("密码错误!");
}
flag = subject.isAuthenticated();
System.out.println("认证状态: "+flag);
//授权
if(subject.isAuthenticated()) {
//验证角色
boolean hasRole = subject.hasRole("admin");
System.out.println("验证角色:"+hasRole);
//验证权限标识符
boolean permitted = subject.isPermitted("user:add");
System.out.println("验证权限标识符:"+permitted);
}
}
}