授权流程
shiro支持三种方式的授权: shiro支持三种方式的授权
代码触发
注解触发
标签触发
代码触发
简单授权实现
Shiro.ini
[users]
#用户root的密码是zsl,此用户具有role1和role2两个角色
root = zsl,role1,role2
#账号为root 密码是 zsl
[roles]
#角色role1对资源user拥有create、update权限
role1=user:create,user:update
#角色role2对资源user拥有create、delete权限
role2=user:create,user:delete
#角色role3对资源user拥有create权限
role3=user:create
Test测试
package com.zsl.test;
import java.util.Arrays;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
public class Test {
public static void main(String[] args) {
// 1.获取SecurityManager工厂对象
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
// 2.通过Factory对象获取SecurityManager对象
SecurityManager securityManager = factory.getInstance();
// 3.将SecurityManager对象添加到当前运行环境中
SecurityUtils.setSecurityManager(securityManager);
// 4.获取Subject对象
Subject subject = SecurityUtils.getSubject();
//从客户端获取账号和密码后设置token
AuthenticationToken token = new UsernamePasswordToken("root", "zsl");
// 登录操作
try {
subject.login(token);
} catch (UnknownAccountException e) {
System.out.println("账号出错...");
} catch(IncorrectCredentialsException e){
System.out.println("密码出错...");
}
// 获取登录的状态
System.out.println(subject.isAuthenticated());
//必须登入成功后才有授权
// 认证通过后进行权限验证 角色
//subject.getPrincipal()获取账号
//subject.hasRole是否存在该角色
System.out.println(subject.getPrincipal()+"是否具有role1角色:"+subject.hasRole("role1"));
System.out.println(subject.getPrincipal()+"是否具有role3角色:"+subject.hasRole("role3"));
//该集合框架中的角色是否全部存在
boolean[] types = subject.hasRoles(Arrays.asList("role1","role2"));
System.out.println(subject.getPrincipal()+"是否具有role1和role2角色:"+types[0]+","+types[1]);
//subject.checkRole("role1");
//subject.checkRole("role3");
// 验证权限
System.out.println(subject.getPrincipal()+"是否具有user:create权限:"+subject.isPermitted("user:create"));
System.out.println(subject.getPrincipal()+"是否具有user:delete角色:"+subject.isPermitted("user:delete"));
boolean t = subject.isPermittedAll("user:create","user:delete");
System.out.println(subject.getPrincipal()+"是否具有user:create和user:delete的权限:"+t);
//检查是否存在该角色和权限,如果不存在则会抛异常
/*subject.checkRole("role3");
subject.checkPermission("aaa");*/
}
}
结果:
true
root是否具有role1角色:true
root是否具有role3角色:false
root是否具有role1和role2角色:true,true
root是否具有user:create权限:true
root是否具有user:delete角色:true
root是否具有user:create和user:delete的权限:true
使用的是shiro自带的Realm。
自定义Realm
自定义TestRealm继承接口AuthorizingRealm,重写授权方法
/**
* 授权
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// TODO Auto-generated method stub
List<String> rolesList = new ArrayList<>();
rolesList.add("role1");
rolesList.add("role2");
rolesList.add("role3");
List<String> perlist = new ArrayList<>();
perlist.add("user:create");
perlist.add("user:update");
perlist.add("user:delete");
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addRoles(rolesList);
info.addStringPermissions(perlist);
return info;
}
结果:
info:root
true
root是否具有role1角色:true
root是否具有role3角色:true
root是否具有role1和role2角色:true,true
root是否具有user:create权限:true
root是否具有user:delete角色:true
root是否具有user:create和user:delete的权限:true
注意:
//检查是否存在该角色和权限,如果不存在则会抛异常
subject.checkRole("role3");
subject.checkPermission("aaa");