Shiro-14-subject 主体

理解Apache Shiro中的主题

毫无疑问,Apache Shiro中最重要的概念是主题。

“主题”只是一个安全术语,它指的是应用程序用户特定于安全的“视图”。Shiro主题实例代表了单个应用程序用户的安全状态和操作。

这些操作包括:

  • 身份验证(登录)

  • 授权(访问控制)

  • 会话的访问

  • 注销

我们最初想叫它“用户”,因为这“很有意义”,但我们决定不叫它:太多的应用程序已经有了它们自己的用户类/框架的api,我们不想与它们冲突。

此外,在安全领域,术语“主体”实际上是公认的命名法。

Shiro的API鼓励应用程序采用以主题为中心的编程范式。

在编写应用程序逻辑时,大多数应用程序开发人员都想知道当前执行的用户是谁。

虽然应用程序通常可以通过自己的机制(UserService,等等)查找任何用户,但当涉及到安全性时,最重要的问题是“当前用户是谁?”

虽然任何主题都可以通过使用SecurityManager获得,但仅基于当前用户/主题的应用程序代码更加自然和直观

当前正在执行的主体

在几乎所有的环境中,你都可以通过使用 org.apache.shiro.SecurityUtils 来获取当前正在执行的主题:

Subject currentUser = SecurityUtils.getSubject();

在独立的应用程序中,getSubject()调用可能会根据应用程序特定位置的用户数据返回一个主题,而在服务器环境(例如web应用程序)中,它会根据与当前线程或传入请求相关联的用户数据获取主题。

在你学习了现在的课程之后,你能做些什么呢?

如果你想让用户在他们当前的会话中使用这些东西,你可以得到他们的会话:

Session session = currentUser.getSession();
session.setAttribute( "someKey", "aValue" );

Session是一个特定于shiro的实例,它提供了常规httpsession所使用的大部分功能,但也有一些额外的好处和一个很大的区别:它不需要HTTP环境!

如果在web应用程序中部署,默认情况下会话将是基于HttpSession的。但是,

在一个非web环境中,比如这个简单的快速入门,Shiro默认情况下会自动使用它的企业会话管理。这意味着无论部署环境如何,您都可以在应用程序的任何层中使用相同的API。这打开了一个全新的应用程序世界,因为任何需要会话的应用程序都不需要强制使用HttpSession或EJB有状态会话bean。而且,任何客户机技术现在都可以共享会话数据。

所以现在你可以获得一个对象和他们的会话。那么真正有用的东西呢,比如检查它们是否被允许做一些事情,比如检查角色和权限?

登陆验证

我们只能对已知的用户做这些检查。上面的Subject实例表示当前用户,但是谁是当前用户呢?嗯,他们是匿名的——也就是说,直到他们至少登录一次。

那么,让我们这样做:

if ( !currentUser.isAuthenticated() ) {//collect user principals and credentials in a gui specific manner//such as username/password html form, X509 certificate, OpenID, etc.//We'll use the username/password example here since it is the most common.//(do you know what movie this is from? ;)UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");//this is all you have to do to support 'remember me' (no config - built in!):token.setRememberMe(true);currentUser.login(token);
}

就是这样!再简单不过了。

但是,如果他们的登录尝试失败怎么办?你可以捕捉各种特定的异常,告诉你到底发生了什么:

try {currentUser.login( token );//if no exception, that's it, we're done!
} catch ( UnknownAccountException uae ) {//username wasn't in the system, show them an error message?
} catch ( IncorrectCredentialsException ice ) {//password didn't match, try again?
} catch ( LockedAccountException lae ) {//account for that username is locked - can't login.  Show them a message?
}... more types exceptions to check if you want ...
} catch ( AuthenticationException ae ) {//unexpected condition - error?
}

作为应用程序/GUI开发人员,您可以选择是否根据异常显示最终用户消息(例如,“系统中没有具有该用户名的帐户”)。

有许多不同类型的异常你可以检查,或者抛出你自己的Shiro可能无法解释的自定义条件。

更多信息请参阅AuthenticationException JavaDoc。

现在,我们有了一个登录用户。

权限校验

我们还能做什么?

让我们说说他们是谁:

//print their identifying principal (in this case, a username): 
log.info( "User [" + currentUser.getPrincipal() + "] logged in successfully." );

我们也可以测试他们是否有特定的角色:

if ( currentUser.hasRole( "schwartz" ) ) {log.info("May the Schwartz be with you!" );
} else {log.info( "Hello, mere mortal." );
}

是否拥有权限:

if ( currentUser.isPermitted( "lightsaber:weild" ) ) {log.info("You may use a lightsaber ring.  Use it wisely.");
} else {log.info("Sorry, lightsaber rings are for schwartz masters only.");
}

此外,我们还可以执行非常强大的实例级权限检查——查看用户是否有能力访问特定类型的实例的能力:

if ( currentUser.isPermitted( "winnebago:drive:eagle5" ) ) {log.info("You are permitted to 'drive' the 'winnebago' with license plate (id) 'eagle5'.  " +"Here are the keys - have fun!");
} else {log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!");
}

最后,登陆的用户也可以登出:

currentUser.logout(); //removes all identifying information and invalidates their session too.

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/696450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

了解JSON的作用及其方法

什么是json JSON(JavaScript Object Notation)是一种轻量级的数据交换格式采用完全独立编程语言的文本格式存储和表示数据(就是字符串)。它基于JavaScript语法,但可以被多种编程语言使用和解析。JSON以键值对的形式存…

高光谱图像降噪方法(2D Wavelet, 3D Wavelet, FORPDN, HyRes等方法)

近年来,随着遥感应用的不断深入,高光谱图像研究已经成为遥感领域发展最迅速的技术之一。与其他传统成像技术相比,高光谱图像具有更多优势:更丰富的信息量、纳米级的光谱分辨率以及范围更广且连续的光谱。因此,在农业、…

选择VR全景行业,需要了解哪些内容?

近年来,随着虚拟现实、增强现实等技术的持续发展,VR全景消费市场得以稳步扩张。其次,元宇宙行业的高速发展,也在进一步拉动VR全景技术的持续进步,带动VR产业的高质量发展。作为一种战略性的新兴产业,国家和…

OJ_学生信息系统

题干 输入样例: 5 zhaoyi 70 80 90 240 qianer 65 32 77 174 sunsan 100 55 68 223 lisi 86 77 90 253 wangwu 100 59 66 225 输出样例: *[qianer] 65 32 77 *[sunsan] 100 55 68 *[wangwu] 100 59 66 lisi 86 77 90 zhaoyi 70 80 90 wangwu 100 59 6…

云打印api搭建,云打印api怎么对接?

相信近来一段时间云打印概念的火热让很多企业和App都有开展打印业务的想法,但是云打印技术的开发又需要有打印设备的支持,这个时候我们可以找到专业的云打印服务平台进行api对接。那么云打印api搭建,云打印api怎么对接?今天来一起…

C语言自定义类型:结构体的使用及其内存对齐【超详细建议点赞收藏】

目录 1. 结构体类型的声明1.1 结构的声明1.2 结构体变量的创建和初始化1.3 结构的特殊声明---匿名结构体1.4 结构的自引用 2.结构体内存对齐(重点!!)2.1 对齐规则2.2 例题讲解2.3 为什么存在内存对齐?2.4 修改默认对齐…

OpenGauss数据库本地搭建并结合内网穿透实现远程访问

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 前言 openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核深度融合…

云渲染农场服务给力吗?全天候不间断服务如何保障?

近年来,云渲染农场以其强大的计算能力和高效的渲染速度而闻名,为各行各业的视觉创作提供了不可或缺的支持。但是,人们普遍关心的是,云渲染农场服务是否真的给力?全天候的服务又是如何保障呢? 实际上&#…

用Python插入页码到PDF文档

页码是许多类型文件中的重要内容,它能方便读者在文档中的导航。在创建PDF文档时,添加页码对于组织和引用内容特别有用。在本文中,我们将探讨如何利用Python程序高效地插入页码到PDF文档中,简化工作流程并创建出精美、结构合理的PD…

【JavaEE】_synchronized关键字——监视器锁monitor lock

目录 1. synchronized的特性 2. synchronized的使用 3. Java标准库中的线程安全类 1. synchronized的特性 (1)互斥: 前文已经介绍,某个线程执行到某个对象的synchronized中时,其他线程如果也执行到同一个对象&…

2024 Sora来了!“手机Agent智能体”也来了!

近日,Open AI发布了能够根据文本生成超现实视频的工具Sora,多款震撼视频引爆科技圈刷屏,热度持续发酵占据AI领域话题中心,被认为是AGI实现过程里的重大里程碑事件。新一轮的人工智能浪潮给人类未来的生产和生活方式带来巨大而深远…

VPN | 世界那么大,我想“魔法”上网看看,可以吗?

Hi,大家好,我是半亩花海。世界那么大,我想“魔法”上网看看,可以吗?随着网络的发展与普及,畅游网络世界已成为人们生活的一部分。它给我们开拓了视野,增长了见闻,丰富了知识&#xf…

FISCO BCOS(二)———配置及使用控制台

一、前言 FISCO BCOS是由金融区块链合作联盟(深圳)与微众银行共同发起的开源区块链项目,支持多链多账本,满足金融行业复杂业务需求。本文将介绍如何在Ubuntu操作系统上使用Linux命令配置FISCO BCOS的控制台并进行get/set操作。 目…

React 模态框的设计(一)拖动组件的设计

春节终结束了,忙得我头疼。终于有时间弄自己的东西了。今天来写一个关于拖动的实例讲解。先看效果: 这是一个简单的组件设计,如果用原生的js设计就很简单,但在React中有些事件必须要多考虑一些。这是一个系列的文章,…

YOLOv9来咧!

文章目录 论文:主要内容一、提出使用PGI(Programmable Gradient Information,可编程梯度信息)来解决信息瓶颈问题和深度监督机制不适合轻量级神经网络的问题。二、设计了GELAN(Generalized ELAN ,广义ELAN)…

LLM 模型融合实践指南:低成本构建高性能语言模型

编者按:随着大语言模型技术的快速发展,模型融合成为一种低成本但高性能的模型构建新途径。本文作者 Maxime Labonne 利用 mergekit 库探索了四种模型融合方法:SLERP、TIES、DARE和passthrough。通过配置示例和案例分析,作者详细阐…

Ansible playbook 剧本部署WEB NFS rsync sersync(及时监控)架构

ansible playbook剧本介绍: playbook 是ansible用于配置,部署和管理被节点的剧本 由一个或多个模块组成,完成统一的目的,实现自动化操作 剧本编写需遵循yaml语法 yaml的三要素: 缩进:两个字符,默…

【Vue3】toRefs和toRef在reactive中的一些应用

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

C++模板->模板的概念、函数模板基本语法、函数模板注意事项、普通函数与函数模板区别、普通函数与函数模板调用规则、模板的局限性

#include<iostream> using namespace std; //交换两个整型函数 void swapInt(int& a, int& b) { int temp a; a b; b temp; } //交换两个浮点型函数 void swapDouble(double& a, double& b) { double temp a; a b; b te…

MATLAB中gtext函数用法

目录 语法 说明 示例 使用鼠标将文本添加到图窗 指定字体大小和颜色 在创建后修改文本 gtext函数的功能是使用鼠标将文本添加到图窗。 语法 gtext(str) gtext(str,Name,Value) t gtext(___) 说明 gtext(str) 在使用鼠标选择的位置插入文本 str。当将鼠标指针悬停在图…