shiro中授权的概念

授权

授权,即访问控制,控制谁能访问哪些资源,主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的

关键对象

授权可简单理解为who对what(which)进行how操作

  • Who 即主体(subject) 主体需要访问系统中的资源

  • What 即资源(Resource) 如系统菜单,页面,按钮,类方法,系统商品信息等。资源包括资源类型和资源实例

  • How 即权限/许可(Permission) 规定了主体对资源的操作许可,权限离开资源没有意义,如用户查询权限,用户添加权限,某个类方法的调用权限

授权流程

avatar

授权方式

基于角色的访问控制

  • RBAC基于角色的访问控制(Role-Based Access Control) 是以角色为中心进行访问控制
    1
    2
    3
    if(subject.hasRole("admin")){
    //操作什么资源
    }

基于资源的访问控制

  • RBAC基于资源的访问控制(Resource-Based Access Control) 是以资源为中心进行访问控制
    1
    2
    3
    if(subject.isPermission("user:find:*")){
    //对所有用户具有查询权限
    }

权限字符串

权限字符串的规则是:资源标识符:操作:资源实例标识符,意思是对哪个资源的哪个实例具有什么操作,”:”是资源/操作/实例的分割线,权限字符串也可以使用*通配符

例子:

  • 用户创建权限:user:create,或user:create:*

  • 用户修改实例001的权限:user:update:001

  • 用户实例001的所有权限:user:*:001

shiro中的授权实现

  • 编程式:
1
2
3
4
5
6
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole("admin")){
//有权限
}else{
//无权限
}
  • 注解式:
1
2
3
4
@RequiresRoles("admin")
public void hello(){
//有权限
}
  • 标签式:
1
2
3
4
5
JSP/GSP 标签: 在JSP/GSP 页面通过相应的标签完成:
<shiro:hasRole name="admin">
<!- 有权限 ->
</shiro:hasRole>
注意:Thymeleaf中使用shiro需要额外集成!

实现

接着上次授权的来
在后面添加

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中的授权就完成了