前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Shiro教程4(授权操作)

Shiro教程4(授权操作)

作者头像
Java帮帮
发布于 2019-12-13 04:33:41
发布于 2019-12-13 04:33:41
73000
代码可运行
举报
运行总次数:0
代码可运行

概念

授权,又称作为访问控制,是对资源的访问管理的过程,即对于认证通过的用户,授予他可以访问某些资源的权限。

授权的方式

shiro支持三种方式的授权:

代码触发

通过写if/else 授权代码块完成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
//有权限
} else {
//无权限
}

注解触发

通过在执行的Java方法上放置相应的注解完成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequiresRoles("admin")
public void hello() {
//有权限
}

标签触发

在JSP/GSP页面通过相应的标签完成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<shiro:hasRole name="admin">
<!— 有权限—>
</shiro:hasRole>

注意本文先讲代码触发,后面两种情况再后面案例中使用讲解。

授权流程图

简单授权实现

在ini.xml文件中设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[users]
#用户zhang的密码是123,此用户具有role1和role2两个角色
zhang=123,role1,role2
wang=123,role2

[roles]
#角色role1对资源user拥有create、update权限
role1=user:create,user:update
#角色role2对资源user拥有create、delete权限
role2=user:create,user:delete
#角色role3对资源user拥有create权限
role3=user:create

验证角色和权限

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void test() {
	// 1.获取SecurityManager工厂对象
	Factory<SecurityManager> factory =
			new IniSecurityManagerFactory("classpath:shiro.ini");
	// 2.通过Factory对象获取SecurityManager对象
	SecurityManager securityManager = factory.getInstance();
	// 3.将SecurityManager对象添加到当前运行环境中
	SecurityUtils.setSecurityManager(securityManager);
	
	// 4.获取Subject对象
	Subject subject = SecurityUtils.getSubject();
	AuthenticationToken token = new UsernamePasswordToken("zhang", "123");
	// 登录操作
	try {
		subject.login(token);
	} catch (UnknownAccountException e) {
		System.out.println("账号出错...");
	} catch(IncorrectCredentialsException e){
		System.out.println("密码出错...");
	}
	// 获取登录的状态
	System.out.println(subject.isAuthenticated());
	// 认证通过后进行权限验证 角色
	System.out.println(subject.getPrincipal()+"是否具有role1角色:"+subject.hasRole("role1"));
	System.out.println(subject.getPrincipal()+"是否具有role3角色:"+subject.hasRole("role3"));
	boolean[] types = subject.hasRoles(Arrays.asList("role1","role2"));
	System.out.println(subject.getPrincipal()+"是否具有role1和role2角色:"+types[0]+","+types[1]);
	//subject.checkRole("role1");
	//subject.checkRole("role3");
	// 验证权限
	System.out.println(subject.getPrincipal()+"是否具有user:create权限:"+subject.isPermitted("user:create"));
	System.out.println(subject.getPrincipal()+"是否具有user:delete角色:"+subject.isPermitted("user:delete"));
	boolean t = subject.isPermittedAll("user:create","user:delete");
	System.out.println(subject.getPrincipal()+"是否具有user:create和user:delete的权限:"+t);
}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
true
zhang是否具有role1角色:true
zhang是否具有role3角色:false
zhang是否具有role1和role2角色:true,true
zhang是否具有user:create权限:true
zhang是否具有user:delete角色:true
zhang是否具有user:create和user:delete的权限:true

注意

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
subject.checkRole("role3");
subject.checkPermission("aaa");

检查是否存在该角色和权限,如果不存在则会抛异常

自定义领域授权

重写授权的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 授权方法
 */
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
	// 获取当前登录的账号
	String userName = (String) principals.getPrimaryPrincipal();
	// 根据账号信息 可以去数据库中查询出该账号对应的 角色和权限信息
	
	List<String> roles = new ArrayList<>();
	roles.add("r1");
	roles.add("r2");
	roles.add("r3");
	
	List<String> ps = new ArrayList<>();
	ps.add("order:create");
	ps.add("order:query");
	ps.add("order:delete");
	
	SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
	// 添加角色
	info.addRole("role1");
	info.addRoles(roles);
	// 添加权限
	info.addStringPermission("user:update");
	info.addStringPermissions(ps);
	return info;
}

ini.xml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[main]
#自定义 realm
customRealm=com.dpb.realm.MyRealm
#将realm设置到securityManager
securityManager.realms=$customRealm

测试方法和之前一样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void test() {
	// 1.获取SecurityManager工厂对象
	Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
	// 2.通过Factory对象获取SecurityManager对象
	SecurityManager securityManager = factory.getInstance();
	// 3.将SecurityManager对象添加到当前运行环境中
	SecurityUtils.setSecurityManager(securityManager);

	// 4.获取Subject对象
	Subject subject = SecurityUtils.getSubject();
	AuthenticationToken token = new UsernamePasswordToken("root", "123456");
	// 登录操作
	try {
		subject.login(token);
	} catch (UnknownAccountException e) {
		System.out.println("账号出错...");
	} catch (IncorrectCredentialsException e) {
		System.out.println("密码出错...");
	}
	// 获取登录的状态
	System.out.println(subject.isAuthenticated());

	// 获取登录的状态
	System.out.println(subject.isAuthenticated());
	// 认证通过后进行权限验证 角色
	System.out.println(subject.getPrincipal() + "是否具有role1角色:" + subject.hasRole("role1"));
	System.out.println(subject.getPrincipal() + "是否具有role3角色:" + subject.hasRole("role3"));
	boolean[] types = subject.hasRoles(Arrays.asList("role1", "role2"));
	System.out.println(subject.getPrincipal() + "是否具有role1和role2角色:" + types[0] + "," + types[1]);
	// subject.checkRole("role1");
	//subject.checkRole("role3");
	// 验证权限
	System.out.println(subject.getPrincipal() + "是否具有user:create权限:" + subject.isPermitted("user:create"));
	System.out.println(subject.getPrincipal() + "是否具有user:delete角色:" + subject.isPermitted("user:delete"));
	boolean t = subject.isPermittedAll("user:create", "user:delete");
	System.out.println(subject.getPrincipal() + "是否具有user:create和user:delete的权限:" + t);
	//subject.checkPermission("aaa");
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java帮帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Shiro中的授权问题
在初识Shiro一文中,我们对Shiro的基本使用已经做了简单的介绍,不懂的小伙伴们可以先阅读上文,今天我们就来看看Shiro中的授权问题。 Shiro中的授权,大体上可以分为两大类,一类是隐式角色,还有一类是显式角色。我们来分别看下。 隐式角色 隐式角色是一种基于角色的访问权限控制,它在使用的过程中,我们直接判断相应的Subject是否是某一种角色,进而判断该Subject是否具备某种权限,比如下面一个例子: 定义用户 在ini文件中定义用户和对应的角色: [users] zhang=123,role1
江南一点雨
2018/04/02
1.2K0
【Shiro】Shiro从小白到大神(三)-权限认证(授权)
本节讲权限认证,也就是授权 基于角色的访问控制和基于权限的访问控制的小实例 以及注解式授权和JSP标签授权详解
谙忆
2021/01/21
1.7K0
【Shiro】Shiro从小白到大神(三)-权限认证(授权)
shiro 第一个授权
1 第一个shiro授权程序 package com.shi.authorization; import java.util.Arrays; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.Secu
用户5927264
2019/07/31
3550
Shiro系列 | 《Shiro开发详细教程》第三章:Shiro授权-上
也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。
码神联盟
2018/11/23
1K0
快速学习Shiro-Shiro的入门
认证:身份认证/登录,验证用户是不是拥有相应的身份。基于shiro的认证,是通过subject的login方法完成用户认证工作的 (1)在resource目录下创建shiro的ini配置文件构造模拟数据(shiro-auth.ini)
cwl_java
2020/01/02
5730
Shiro第二篇【授权、整合Spirng、过滤器】
前言 本文主要讲解的知识点有以下: Shiro授权的方式简单介绍 与Spring整合 初始Shiro过滤器 一、Shiro授权 上一篇我们已经讲解了Shiro的认证相关的知识了,现在我们来弄Shiro
Java3y
2018/04/02
9330
Shiro第二篇【授权、整合Spirng、过滤器】
③【Shiro】角色(权限组)、权限授权
.29.
2024/03/21
2940
③【Shiro】角色(权限组)、权限授权
Shiro框架01之什么是shiro+shiro的架构+权限认证
shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权。
天蝎座的程序媛
2022/11/18
7440
Shiro框架01之什么是shiro+shiro的架构+权限认证
JAVAEE安全框架之shiro第一课
new UsernamePasswordToken(username, password);
张哥编程
2024/12/13
1460
JAVAEE安全框架之shiro第一课
深入浅出Shiro系列——权限认证
授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resou rce)、权限(Permission)、角色(Role )。
程序员的时光001
2020/07/14
4430
深入浅出Shiro系列——权限认证
Shiro学习笔记 三(认证授权)
1.由于不断的创建SecurityFactory工程等步骤重复多次,所以应该将这些步骤封装成一个工具类
梅花
2020/09/28
3800
Shiro学习笔记 三(认证授权)
Shiro框架学习,Shiro授权
规则即:“用户名=密码,角色1,角色2”,如果需要在应用中判断用户是否有相应角色,就需要在相应的Realm中返回角色信息,也就是说Shiro不负责维护用户-角色信息,需要应用提供,Shiro只是提供相应的接口方便验证,后续会介绍如何动态的获取用户角色。
用户1289394
2021/05/06
8270
Shiro学习之Shiro基本使用(2)
(1)授权,也叫访问控制,即在应用中控制谁访问哪些资源(如访问页面/编辑数据/页面操作 等)。在授权中需了解的几个关键对象 :主体(Subject)、资源(Resource)、权限 (Permission)、角(Role)。
默 语
2024/11/20
1800
Shiro学习之Shiro基本使用(2)
ShiroRealm中配置散列And授权
要保证存储在数据库中的密码是经过散列之后的,不然认证器进行认证的时候是通过你定义的规则去进行认证的,而你数据库存储的不一致会导致不成功,假如你设置认证的相关信息为盐为 yby6 而数据库中已经存储的密码是通过 JonathanTang 盐值进行加密存储的,你登录的时候认证器去验证的时候就会导致双方不一致,所以数据库中存储的信息需要和你认证器设置的规则加密之后的信息一致才行。
杨不易呀
2023/11/29
2953
跟开涛老师学shiro — 授权
授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。(这里的资源和权限区别是什么呢?)
全栈程序员站长
2022/09/20
4710
从权限控制到shiro框架的应用
说明:本文很多观点和内容来自互联网以及各种资料,如果侵犯了您的权益,请及时联系我,我会删除相关内容。 权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。 用户身份认证 身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简
神秘的寇先森
2018/05/30
2.4K0
shiro笔记(三)maven项目集成shiro的第一个项目,实现认证和判断权限;加密及凭证匹配器
导入依赖之后,我们要创建ini配置文件,以后就在这个配置文件里面写固定的数据,让shiro框架读取这个配置文件实现认证和授权。
一写代码就开心
2021/08/10
4770
权限管理与Shiro入门(十一)
Realm域:Shiro从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源
用户1289394
2023/10/07
2220
权限管理与Shiro入门(十一)
shiro框架是什么_中国历史知识框架
2.Shiro权限框架 2.1 概念 2.2 Apache Shiro 与Spring Security区别
全栈程序员站长
2022/10/05
5680
shiro框架是什么_中国历史知识框架
shiro+SSM
当前的操作用户 可以是人 爬虫 当前跟软件交互的东西 在shiro当中我们可以统称"用户" 在代码的任何地方,你都能轻易的获得Shiro Subject。 一旦获得Subject,你就可以立即获得你希望用Shiro为当前用户做的90%的事情:登录、退、访问会话、执行授权检查等
JokerDJ
2023/11/27
2660
shiro+SSM
相关推荐
Shiro中的授权问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档