Shior 框架进阶(五)
----------授权
授权流程原理
授权
授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体 (Subject)、资源(Resource)、权限(Permission)、角色(Role)。
主体(Subject) 主体,即访问应用的用户,在Shiro中使用Subject代表该用户。用户只有授权后才允许访问相应的资源。
资源(Resource) 在应用中用户可以访问的任何东西,比如JSP 页面、某些数据、某个业务方法等等都是资源。用户只要授权后才能访问。
权限(Permission) 权限表示在应用中用户能不能访问某个资源, 如:访问用户列表页面查看/新增/修改/删除用户数据(即很多时候都是CRUD(增查改删)式权限控制)打印文档等等。
角色(Role) 角色代表了操作集合,可以理解为权限的集合,一般情况下我们会赋予用户角色而不是权限,即这样用户可以拥有一组权限,赋予权限 时比较方便。 典型的如:项目经理、技术总监、CTO、开发工程师等都是角色,不同的角色拥有一组不同的权限。
判断是否授权的方式
Shiro 支持三种方式的授权判断:
编程式
通过写if/else 授权代码块完成:
Subject subject = SecurityUtils.getSubject(); if(subject.hasRole(“admin”))
{
//有权限
} else {
//无权限
}
注解式
通过在执行的Java方法上放置相应的注解完成:
@RequiresRoles("admin")
public void hello() {
//有权限
}
JSP 标签 在JSP 页面通过相应的标签完成:
<shiro:hasRole name="admin">
<!— 有权限—>
</shiro:hasRole>
- 配置ini文件 shiroauthorization.ini
#用户
[users]
#用户Sulliven的密码是123456,此用户具有role1和role3两个角色
helen=123456,role1,role3
lisi=123456,role2
#角色和权限
[roles]
role1=system:user:*,system:menu:*
role2=system:user:list
role3=system:config:*
- 判断角色和权限
注意:首先要认证
public class AuthorizationTest {
// 角色授权、资源授权测试
@Test
public void testAuthorization() {
//=================认证开始:以下和前面认证的测试一致
// 创建SecurityManager工厂
IniSecurityManagerFactory factory =
new IniSecurityManagerFactory("classpath:shiro-authorization.ini");
// 创建SecurityManager
SecurityManager securityManager = factory.getInstance();
// 将securityManager设置当前的运行环境中
SecurityUtils.setSecurityManager(securityManager);
// 从SecurityUtils里边创建一个subject
Subject subject = SecurityUtils.getSubject();
// 在认证提交前准备token(令牌)
// 这里的账号和密码 将来是由用户输入进去
UsernamePasswordToken token = new UsernamePasswordToken("Sulliven", "123456");
// 执行认证提交
subject.login(token);
// 是否认证通过
boolean isAuthenticated = subject.isAuthenticated();
System.out.println("是否认证通过:" + isAuthenticated);
// 退出操作(不要退出登录)
//subject.logout();
// 是否认证通过
//isAuthenticated = subject.isAuthenticated();
//System.out.println("是否认证通过:" + isAuthenticated);
//=================认证结束 //=================授权开始
// 认证通过后执行授权
//(1)基于角色的授权
//(1.1) hasRole传入角色标识:单个角色判断
boolean ishasRole = subject.hasRole("role1");
System.out.println("单个角色判断" + ishasRole);
//(1.2)hasRole传入角色标识:多个角色判断
boolean[] hasRoles = subject.hasRoles(Arrays.asList("role1", "role2"));
System.out.println("当前用户是否拥有以下角色:");
for (boolean b : hasRoles) {
System.out.println(b);
}
//(1.3)hasAllRoles是否同时拥有以下多个角色:多个角色判断
boolean hasAllRoles = subject.hasAllRoles(Arrays.asList("role1", "role3"));
System.out.println("多个角色判断" + hasAllRoles);
//(1.4)除了has这之后角色的判断还有check方法不会主动抛出异常,但是需要捕获
//(2)基于资源的授权
//(2.1)isPermitted传入权限标识符:单个权限判断
boolean isPermitted = subject.isPermitted("system:user:create");
System.out.println("是否有权限:" + isPermitted);
//(2.2)多个权限判断
boolean isPermittedAll = subject.isPermittedAll("system:user:list", "system:config:list");
System.out.println("多个权限判断:" + isPermittedAll);
//(2.3)使用check方法进行授权检测,如果授权不通过会抛出异常
try {
subject.checkPermission("system:config:list");
} catch (AuthorizationException e) {
System.out.println("权限未定义");
e.printStackTrace();
}
}
}
以上就是对授权的一个简单的展示,以及各种检测授权的方法
注意的是:一般我们一不同的角色来给与不同的权限,也就是通过给用户分配角色来达到分配权限的目的;
但是在实际运用当中我们是通过shiro来授权包括检验,所以以后是不会在ini文件中授予角色的,所以下一篇会为大家带来之前提及的自定义realm来完成授权。
敬请期待!!!!!!
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42112846;