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

Shiro教程4(授权操作)

作者头像
Java帮帮
发布于 2019-12-13 04:33:41
发布于 2019-12-13 04:33:41
73010
代码可运行
举报
运行总次数: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 删除。

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

评论
登录后参与评论
1 条评论
热度
最新
您好,您参加的【玩转Cloud Studio】第二季获奖名单出来啦:https://cloud.tencent.com/developer/article/2269353,文末可查看名单~恭喜您获奖哦,请您联系腾讯云开发者社区助理(微信号:yun_assistant)填写收货信息,完成兑奖。
您好,您参加的【玩转Cloud Studio】第二季获奖名单出来啦:https://cloud.tencent.com/developer/article/2269353,文末可查看名单~恭喜您获奖哦,请您联系腾讯云开发者社区助理(微信号:yun_assistant)填写收货信息,完成兑奖。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
使用 Jenkins Pipeline 流水线部署 Kubernetes 应用
要实现在 Jenkins 中的构建工作,可以有多种方式,我们这里采用比较常用的 Pipeline 这种方式。Pipeline,简单来说,就是一套运行在 Jenkins 上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。
我是阳明
2021/06/25
5.3K0
使用 Jenkins Pipeline 流水线部署 Kubernetes 应用
史诗级整理 Jenkins 流水线详解
jenkins 有 2 种流水线分为声明式流水线与脚本化流水线,脚本化流水线是 jenkins 旧版本使用的流水线脚本,新版本 Jenkins 推荐使用声明式流水线。文档只介绍声明流水线。
我的小碗汤
2023/03/19
8K0
史诗级整理 Jenkins 流水线详解
使用 Jenkins 构建 CI/CD 之多分支流水线指北
由于公司的 Jenkins 配置没有部署成功的通知,在我学了几天的 Jenkins 后终于是对公司的 Jenkins 配置下手了,结果我刚装完 dingtalk 插件自动重启后,发现之前主管配置的构建项目数据都丢失了,正好给了我练手的机会,于是就有了以下从0到1的辛酸历程。
DevOps时代
2021/04/20
2.3K0
使用 Jenkins 构建 CI/CD 之多分支流水线指北
基于GitLabCI的Python交付流水线实现
首先,我们需要在github中找一个Python项目,如果具有编码能力也可以写一个简单web app。以下项目是一个Flask项目,简单的web应用。这个项目之前使用的是Jenkins完成的持续交付,现在改造成GitlabCI完成。
DevOps云学堂
2020/06/15
1.2K0
结合k8s和pipeline的流水线,并通过k8s接口完成镜像升级
现在这家单位的CICD比较的混乱,然后突发奇想,想改造下,于是就用pipeline做了一个简单的流水线,下面是关于它的一些介绍
dogfei
2021/01/27
7670
创建 Tekton 流水线
前面我们创建的两个任务 test 和 build-and-push 都已经完成了,我们还可以创建一个流水线来将这两个任务组织起来,形成一个流水线,这里就是我们要使用的 Pipeline 这个 CRD 对象。
我是阳明
2021/06/25
7120
创建 Tekton 流水线
3种创建Jenkins流水线的方法 - Classic UI, BlueOcean, Git
Jenkins是一个DevOps工具,可以用来自动构建、测试和交付软件代码。如果你是Jenkins的新手,本教程将帮助你理解如何使用以下方法之一创建Jenkins流水线(Pipeline):
用户1516716
2021/04/13
4.1K0
3种创建Jenkins流水线的方法 - Classic UI, BlueOcean, Git
GitLab平台太单调? 配置Pipeline流水线,装上这个流水线“瀑布灯”!
在上一篇文章中,我们介绍了如何使用Docker搭建自己的GitLab代码托管平台。
Mintimate
2023/10/01
3.2K0
GitLab平台太单调? 配置Pipeline流水线,装上这个流水线“瀑布灯”!
CI/CD流水线实战
不知道为什么,现在什么技术都想学,因为我觉得我遇到了技术的壁垒,大的项目接触不到,做的项目一个字辣*。所以,整个人心浮气躁,我已经得通过每天的骑行和长跑缓解这种浮躁了。一个周末,我再次宅在了家里,学习了一下CICD。
shigen
2023/08/15
4610
CI/CD流水线实战
如何搭建 Vue.js 开源项目的 CI/CD 流水线
本文旨在探讨如何为开源的 Vue.js 项目构建 CI/CD 流水线,以实现自动化的构建、测试和发布流程。通过使用 GitHub Actions 和 Jenkins 等工具,可以显著提高开发效率,减少手动操作带来的错误。文章将详细介绍流水线的设计和实现,并提供可运行的示例代码模块。
Swift社区
2025/01/11
2310
如何搭建 Vue.js 开源项目的 CI/CD 流水线
使用 Tekton 创建 CI/CD 流水线(2/2)
在前面文章中,我们在 Kubernetes 集群中安装了 Tekton,通过 Tekton 克隆 GitHub 代码仓库并执行了应用测试命令。接着前面的内容,本文我们将创建一个新的 Task 来构建一个 Docker 镜像并将其推送到 Docker Hub,最后,我们将这些任务组合成一个流水线。
我是阳明
2020/06/15
9740
云实验室(22) - kubesphere的springboot流水线
docker仓库 : dockerhub / 私有镜像仓库 前端代码仓库 : git / gitlab / gitee ...
惊羽-布壳儿
2022/06/15
9230
云实验室(22) - kubesphere的springboot流水线
KitOps将DevOps流水线转变为MLOps流水线
机器学习 和 DevOps 实践的结合催生了 MLOps,这是一个专门领域,专注于在生产环境中自动化 ML 模型的开发、部署和管理。然而,实现流线型 MLOps 工作流的主要障碍在于 DevOps 和机器学习流水线之间的传统分离。
云云众生s
2024/06/24
1650
KitOps将DevOps流水线转变为MLOps流水线
使用 Argo CD 进行 GitOps 流水线改造
Argo CD 是一个为 Kubernetes 而生的,遵循声明式 GitOps 理念的持续部署工具。Argo CD 可在 Git 存储库更改时自动同步和部署应用程序。
我是阳明
2023/09/25
1.9K0
使用 Argo CD 进行 GitOps 流水线改造
jenkins使用流水线部署go程序
章工运维
2023/07/09
4280
jenkins使用流水线部署go程序
使用 KinD 加速 CI/CD 流水线
现在安装 Kubernetes 集群已经变得越来越简单了,出现了很多方案,各种方案都有自己适合的使用场景。虽然我们也可以很快速在云环境下面启动一个 Kubernetes 集群,但是对于开发人员通常更喜欢能够快速上手的东西,Kubernetes in Docker(KinD)这个工具就可以通过创建容器来作为 Kubernetes 的节点,只需要在机器上安装 Docker 就可以使用,它允许我们在很短的时间内就启动一个多节点的集群,而不依赖任何其他工具或云服务商,这就使得它不仅对本地开发非常有用,而且对 CI/CD 也很有帮助。
我是阳明
2020/10/26
7800
使用 KinD 加速 CI/CD 流水线
使用 Kubernetes 和 Jenkins 创建一个 CI/CD 流水线
CI/CD 同 DevOps、Agile、Scrum、Kanban、自动化以及其他术语一样,是一个一起被经常提及的专用术语。有时候,它被当做工作流的一部分,但是并没有搞清楚这是什么或者为什么它会被采用。对于年轻的 DevOps 工程师来说,使用 CI/CD 理所当然已经成为了常态,可能他们并没有看到“传统”的软件发布流程而因此不欣赏 CI/CD。
DevOps持续交付
2020/03/17
1.8K3
使用 Kubernetes 和 Jenkins 创建一个 CI/CD 流水线
如何使用 Jenkins 的脚本化流水线(Pipeline)
在这篇简单的教程中,你将会学习到 Jenkins 的流水线即代码,以及如何开发流水线脚本的指导。 Jenkins 是一个开源持续集成服务器,它可以提供持续执行自动化构建和测试的能力。Jenkins 可以控制和监控多种任务,包括:拉取代码、静态代码分析、构建工程、执行单元测试、自动化或者性能测试,最后部署应用。这些任务通常是一个持续部署流水线。 流水线(Pipeline)是 Jenkins 的一套插件。流水线可以认为是执行任务的一系列阶段,它可以持续地发布你的应用。“持续”的概念是相对于你的应用环境来说的
DevOps时代
2018/04/17
8.9K0
如何使用 Jenkins 的脚本化流水线(Pipeline)
献给流水线开发者的一份FAQ文档
来说说今天很多同学在做流水线的时候遇到的一些问题,我把问题整理下来分享给更多的人。能少踩坑就少踩一点点。
DevOps云学堂
2020/04/22
6310
献给流水线开发者的一份FAQ文档
八、pipeline流水线构建项目
JENKINS 2.0的精髓是PIPELINE AS CODE,是帮助JENKINS实现CI到CD转变的重要角色。什么是PIPELINE,简单来说,就是一套运行于JENKINS上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。 PIPELINE的实现方式是一套GROOVY DSL,任何发布流程都可以表述为一段GROOVY脚本,并且 JENKINS支持从代码库直接读取脚本,从而实现了PIPELINE AS CODE的理念。
jackxiao
2021/11/16
6750
相关推荐
使用 Jenkins Pipeline 流水线部署 Kubernetes 应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验