09 Shrio 授权的代码实现

本文涉及的产品
访问控制,不限时长
简介: 09 Shrio 授权的代码实现

基于角色的访问控制(隐式角色)

1、在ini配置文件配置用户拥有的角色(shiro-role.ini)

[users]  
zhang=123,role1,role2  
wang=123,role1

规则即:“用户名=密码,角色1,角色2”,如果需要在应用中判断用户是否有相应角色,就需要在相应的Realm中返回角色信息,也就是说Shiro不负责维护用户-角色信息,需要应用提供,Shiro只是提供相应的接口方便验证,后续会介绍如何动态的获取用户角色。

2、测试用例(com.github.zhangkaitao.shiro.chapter3.RoleTest)

@Test  
public void testHasRole() {  
    login("classpath:shiro-role.ini", "zhang", "123");  
    //判断拥有角色:role1  
    Assert.assertTrue(subject().hasRole("role1"));  
    //判断拥有角色:role1 and role2  
    Assert.assertTrue(subject().hasAllRoles(Arrays.asList("role1", "role2")));  
    //判断拥有角色:role1 and role2 and !role3  
    boolean[] result = subject().hasRoles(Arrays.asList("role1", "role2", "role3"));  
    Assert.assertEquals(true, result[0]);  
    Assert.assertEquals(true, result[1]);  
    Assert.assertEquals(false, result[2]);  
}

Shiro提供了hasRole/hasRole用于判断用户是否拥有某个角色/某些权限;但是没有提供如hashAnyRole用于判断是否有某些权限中的某一个。

@Test(expected = UnauthorizedException.class)  
public void testCheckRole() {  
    login("classpath:shiro-role.ini", "zhang", "123");  
    //断言拥有角色:role1  
    subject().checkRole("role1");  
    //断言拥有角色:role1 and role3 失败抛出异常  
    subject().checkRoles("role1", "role3");  
}

Shiro提供的checkRole/checkRoleshasRole/hasAllRoles不同的地方是它在判断为假的情况下会抛出UnauthorizedException异常

到此基于角色的访问控制(即隐式角色)就完成了,这种方式的缺点就是如果很多地方进行了角色判断,但是有一天不需要了那么就需要修改相应代码把所有相关的地方进行删除;这就是粗粒度造成的问题。

基于资源的访问控制(显示角色)

1、在ini配置文件配置用户拥有的角色及角色-权限关系(shiro-permission.ini)

[users]  
zhang=123,role1,role2  
wang=123,role1  
[roles]  
role1=user:create,user:update  
role2=user:create,user:delete

规则:“用户名=密码,角色1,角色2”“角色=权限1,权限2”,即首先根据用户名找到角色,然后根据角色再找到权限;即角色是权限集合;Shiro同样不进行权限的维护,需要我们通过Realm返回相应的权限信息。只需要维护“用户——角色”之间的关系即可。

2、测试用例(com.github.zhangkaitao.shiro.chapter3.PermissionTest)

@Test  
public void testIsPermitted() {  
    login("classpath:shiro-permission.ini", "zhang", "123");  
    //判断拥有权限:user:create  
    Assert.assertTrue(subject().isPermitted("user:create"));  
    //判断拥有权限:user:update and user:delete  
    Assert.assertTrue(subject().isPermittedAll("user:update", "user:delete"));  
    //判断没有权限:user:view  
    Assert.assertFalse(subject().isPermitted("user:view"));  
}

Shiro提供了isPermittedisPermittedAll用于判断用户是否拥有某个权限或所有权限,也没有提供如isPermittedAny用于判断拥有某一个权限的接口。

@Test(expected = UnauthorizedException.class)  
public void testCheckPermission () {  
    login("classpath:shiro-permission.ini", "zhang", "123");  
    //断言拥有权限:user:create  
    subject().checkPermission("user:create");  
    //断言拥有权限:user:delete and user:update  
    subject().checkPermissions("user:delete", "user:update");  
    //断言拥有权限:user:view 失败抛出异常  
    subject().checkPermissions("user:view");  
}

但是失败的情况下会抛出UnauthorizedException异常。

到此基于资源的访问控制(显示角色)就完成了,也可以叫基于权限的访问控制,这种方式的一般规则是“资源标识符:操作”,即是资源级别的粒度;这种方式的好处就是如果要修改基本都是一个资源级别的修改,不会对其他模块代码产生影响,粒度小。但是实现起来可能稍微复杂点,需要维护“用户——角色,角色——权限(资源:操作)”之间的关系。

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
目录
相关文章
shiro登录认证后不执行授权doGetAuthorizationInfo的解决
shiro登录认证后不执行授权doGetAuthorizationInfo的解决
shiro登录认证后不执行授权doGetAuthorizationInfo的解决
|
7月前
|
安全 Java 数据安全/隐私保护
使用Java实现安全的用户身份验证与授权
使用Java实现安全的用户身份验证与授权
|
安全
springsecurity配置类以及授权逻辑的编写
springsecurity配置类以及授权逻辑的编写
115 0
|
9月前
|
API
uniapp怎么实现授权登录
uniapp怎么实现授权登录
231 2
|
Java
08 Shrio 授权的三种方式
08 Shrio 授权的三种方式
50 1
|
Java 数据安全/隐私保护
07 Shrio 授权的几个关键对象
07 Shrio 授权的几个关键对象
56 1
11 Shrio 授权流程
11 Shrio 授权流程
45 0
|
安全 API 数据库
五.SpringSecurity基础-授权流程
SpringSecurity基础-授权流程
|
安全 API 数据库
SpringSecurity基础-授权流程
授权一定是在认证通过之后,授权流程是通过FilterSecurityInterceptor拦截器来完成,FilterSecurityInterceptor通过调用SecurityMetadataSource来获取当前访问的资源所需要的权限,然后通过调用AccessDecisionManager投票决定当前用户是否有权限访问当前资源。授权流程如下
153 0
|
API 数据安全/隐私保护
Yii2.0框架中如何进行身份验证和授权操作?支持哪些认证方式和授权方式?
Yii2.0框架中如何进行身份验证和授权操作?支持哪些认证方式和授权方式?
224 0