04Shiro实现授权
1.授权概述
- 授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。
2.关键对象介绍
1.主体
- 即访问应用的用户,在shiro中使用subject代表该用户,用户只有授权后才允许访问响应的资源
2.资源
- 在应用中用户可以访问的任何东西,比如访问JSP页面、查看/编辑某些数据,访问某个业务方法、打印文本等等都是资源。用户只有授权后才能访问。
3.权限
- 安全策略中的原子授权单位,通过权限我们可以表示在应用中用户没有没有操作某个资源的权利。即权限表示在应用中用户能不能访问某个资源,如:访问用户列表页面查看/新增/修改/删除用户数据(即很多时候都是CRUD(增删改查)式权限控制)打印文档等
4.角色
- 角色代表了操作集合,可以理解为权限的集合,一般情况下我们会赋予用户角色而不是权限,即这样用户可以拥有一组权限,赋予权限时比较方便。典型的如:项目经理、技术总监、CTO等都是角色,不同角色拥有一组不同的权限。
3.shiro授权流程
4.相关方法说明
- subject.hasRole(""); //判断是否有角色
- subject.hasRoles(List); //分别判断用户是否具有List中每个内容
- subject.hasAllRoles(Collection); //返回Boolean,要求参数中所有角色用户都需要具有
- subject.isPermitted(""); //判断是否具有权限
5.修改shiro.ini文件
#配置用户
[users]
zhangsan=123456,role1
lisi=123456,role2
wangwu=123456,role3
zhaoliu=123456,role2,role3
sunqi=123456,role4
#声明角色
[roles]
role1=user:query,user:add,user:update,user:delete,user:export
role2=user:query,user:add
role3=user:query,user:export
role4=*:*
6.测试
// 判断用户是否认证通过
boolean authenticated = subject.isAuthenticated();
System.out.println("是否认证通过:" + authenticated);
// 角色判断
boolean hasRole1 = subject.hasRole("role1");
System.out.println("是否有role1的角色:" + hasRole1);
// 分别判断集合里面的角色,返回数组
List<String> roleIdentifiers = Arrays.asList("role1", "role2", "role3");
boolean[] hasRoles = subject.hasRoles(roleIdentifiers);
for (boolean b : hasRoles) {
System.out.println(b);
}
// 判断当前用户是否有roleIdentifiers集合里面的所有角色
boolean hasAllRoles = subject.hasAllRoles(roleIdentifiers);
System.out.println("是否有roleIdentifiers里的所有角色" + hasAllRoles);
//权限判断
boolean permitted = subject.isPermitted("user:query");
System.out.println("判断当前用户是否有user:query的权限" + permitted);
boolean[] permitted1 = subject.isPermitted("user:query", "user:add", "user:export");
for (boolean b : permitted1) {
System.out.println(b);
}
boolean permittedAll = subject.isPermittedAll("user:query", "user:add", "user:export");
System.out.println(permittedAll);