1,授权概述
授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作
等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、
角色(Role)。
2,关键对象介绍
1,主体
主体,即访问应用的用户,在Shiro中使用Subject代表该用户。用户只有授权后才允许访
问相应的资源。
2,资源
在应用中用户可以访问的任何东西,比如访问JSP 页面、查看/编辑某些数据、访问某个业
务方法、打印文本等等都是资源。用户只要授权后才能访问。
3,权限
安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的
权力。即权限表示在应用中用户能不能访问某个资源,如:访问用户列表页面查看/新增/修改/删除用户数据(即很多时候都是CRUD(增查改删)式权限控制)打印文档等等。。。
4,角色
角色代表了操作集合,可以理解为权限的集合,一般情况下我们会赋予用户角色而不是权
限,即这样用户可以拥有一组权限,赋予权限时比较方便。典型的如:项目经理、技术总
监、CTO、开发工程师等都是角色,不同的角色拥有一组不同的权限。
3,授权流程
4,相关方法说明
1 subject.hasRole(“”); 判断是否有角色
2 subject.hashRoles(List);分别判断用户是否具有List中每个内容
3 subject.hasAllRoles(Collection);返回boolean,要求参数中所有角色用户都需要具有.
4 subject.isPermitted(“”);判断是否具有权限.
5,配置shiro.ini
[users]
#用户zhang的密码是123,此用户具有role1和role2两个角色
zhangsan=zs,role1,role2
wang=123,role2
#权限
[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
6,权限标识符号规则
权限标识符号规则:资源:操作:实例(中间使用半角:分隔)
user:create:01 表示对用户资源的01实例进行create操作。
user:create:表示对用户资源进行create操作,相当于user:create:*,对所有用户资源实例进行create操作。
user:*:01 表示对用户资源实例01进行所有操作。
7,测试用户是否有当前角色和权限
public static void main(String[] args) {
// 1.创建securityManager工厂 ecurityManager JDK也有这个类,在java.lang包 注意不要使用jdk里面那个类
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
// 2.创建securityManager
SecurityManager securityManager = factory.getInstance();
// 3.将securityManager绑定到运行环境
SecurityUtils.setSecurityManager(securityManager);
// 4.创建主体 只要线程不变,Subject不变
Subject subject = SecurityUtils.getSubject();
// 5.创建token用于认证 客户端传递过来的用户名和密码
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "zs");
// 6.登录(认证)
try {
subject.login(token);
System.out.println("登录成功");
} catch (IncorrectCredentialsException e) {
System.out.println("密码不正确");
}catch (UnknownAccountException e) {
System.out.println("没有这个帐号");
}catch (AuthenticationException e) {
e.printStackTrace();
}
System.out.println("认证状态:" + subject.isAuthenticated());
// 7.授权 基于角色授权 基于资源的授权
// 7.1基于角色授权
// 授权单个
boolean permitted = subject.hasRole("role1");
System.out.println("这是授权单个:" + permitted);
boolean hasAllRoles = subject.hasAllRoles(Arrays.asList("role1", "role2", "role3"));
System.out.println("这是多个授权:" + hasAllRoles);
// 使用check方法进行授权,如果授权不通过会抛出异常
// subject.checkRole("role13");
// 7.2 基于资源的授权
// isPermitted传入权限标识符
boolean isPermitted = subject.isPermitted("user:create:1");
System.out.println("单个权限判断" + isPermitted);
boolean isPermittedAll = subject.isPermittedAll("user:create:1", "user:delete");
System.out.println("多个权限判断" + isPermittedAll);
// 使用check方法进行授权,如果授权不通过会抛出异常
try {
subject.checkPermission("items:create:1");
} catch (UnauthorizedException e) {
// e.printStackTrace();
System.out.println("没有这个权限");
}
}