shiro中授权的概念
授权
授权,即访问控制,控制谁能访问哪些资源,主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的
关键对象
授权可简单理解为who对what(which)进行how操作
Who 即主体(subject) 主体需要访问系统中的资源
What 即资源(Resource) 如系统菜单,页面,按钮,类方法,系统商品信息等。资源包括资源类型和资源实例
How 即权限/许可(Permission) 规定了主体对资源的操作许可,权限离开资源没有意义,如用户查询权限,用户添加权限,某个类方法的调用权限
授权流程
授权方式
基于角色的访问控制
- RBAC基于角色的访问控制(Role-Based Access Control) 是以角色为中心进行访问控制
1
2
3if(subject.hasRole("admin")){
//操作什么资源
}
基于资源的访问控制
- RBAC基于资源的访问控制(Resource-Based Access Control) 是以资源为中心进行访问控制
1
2
3if(subject.isPermission("user:find:*")){
//对所有用户具有查询权限
}
权限字符串
权限字符串的规则是:资源标识符:操作:资源实例标识符,意思是对哪个资源的哪个实例具有什么操作,”:”是资源/操作/实例的分割线,权限字符串也可以使用*通配符
例子:
用户创建权限:user:create,或user:create:*
用户修改实例001的权限:user:update:001
用户实例001的所有权限:user:*:001
shiro中的授权实现
- 编程式:
1 | Subject subject = SecurityUtils.getSubject(); |
- 注解式:
1 | "admin") ( |
- 标签式:
1 | JSP/GSP 标签: 在JSP/GSP 页面通过相应的标签完成: |
实现
接着上次授权的来
在后面添加1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29//认证用户进行授权
if(subject.isAuthenticated()){
//基于角色权限控制
System.out.println(subject.hasRole("admin"));;
//基于多角色权限控制
System.out.println(subject.hasAllRoles(Arrays.asList("admin", "user")));
//基于具有其中一个角色
boolean[] booleans = subject.hasRoles(Arrays.asList("admin", "super", "user"));
for(boolean aBoolean:booleans){
System.out.println(aBoolean);
}
System.out.println("==========================================");
//基于权限字符串的访问控制,资源标志符:操作:资源类型
System.out.println("权限:"+subject.isPermitted("user:*:01"));
System.out.println("权限:"+subject.isPermitted("product:update"));
//分别具有哪些权限
boolean[] permitted = subject.isPermitted("user:*:01", "order:*:10");
for(boolean b : permitted){
System.out.println(b);
}
//同时具有哪些权限
boolean permittedAll = subject.isPermittedAll("user:*:01", "product:*");
System.out.println(permittedAll);
}
在CustomerMd5Realm中添加1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
String primaryPrincipal = (String)principalCollection.getPrimaryPrincipal();
System.out.println("身份信息:"+primaryPrincipal);
//根据身份信息 用户名 获取当前用户的角色信息,以及权限信息 xiaochen admin user
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
//将数据库中查询的角色信息赋值给权限对象
simpleAuthorizationInfo.addRole("admin");
simpleAuthorizationInfo.addRole("user");
//将数据库中查询权限信息赋值个权限对象
simpleAuthorizationInfo.addStringPermission("user:*:01");
simpleAuthorizationInfo.addStringPermission("product:create:02");
return simpleAuthorizationInfo;
}
到这里shiro中的授权就完成了