shiro(二)shiro详解

本文解析了一线大厂Java面试中的常见问题,涵盖Shiro权限模型、身份认证流程、角色与权限管理,以及高并发场景下的秒杀系统设计策略。深入讲解了AuthenticationToken、UsernamePasswordToken和不同授权方式。阅读链接提供了详细的学习资料。
摘要由CSDN通过智能技术生成

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

2、仅定义非空的 [users] 或 [roles] 部分就将自动地触发org.apache.shiro.realm.text.IniRealm 实例的创建

四、Shiro 的 Permissions

1、基础语法之简单的字符串:即用简单的字符串来表示一个权限,如:user (相当于:user:*)

2、基础语法之多层次管理:

一、例如:user:query、user:edit

二、冒号是一个特殊字符,它用来分隔权限字符串的下一部件:第一部分是权限被操作的领域(打印机),第二部分是被执行的操作。

三、多个值:每个部件能够保护多个值。因此,除了授予用户 user:query 和 user:edit 权限外,也可以简单地授予他们一个:user:query, edit

四、还可以用 * 号代替所有的值,如:user:* , 也可以写:*:query,表示某个用户在所有的领域都有 query 的权限

五、身份认证:Authentication

1、Authentication :身份验证——通过提交用户的身份和凭证给 Shiro,以判断它们是否和应用程序预期的相匹配。

2、基本概念

一、Principals(身份):Subject 的 identifying attributes(标识属性)。比如我们登录提交的用户名。

二、Credentials(凭证):用来作为一种起支持作用的证据,此证据包含身份证明。比如我们登录提供的密码

3、认证的基本步骤

一、收集Subjects 提交的Principals(身份)和Credentials(凭证);

二、提交Principals(身份)和Credentials(凭证)进行身份验证;

三、如果提交成功,则允许访问,否则重新进行身份验证或者阻止访问。

六、身份认证 – 示例代码

这里写图片描述

1、AuthenticationToken:Shiro 中代表提交的 Principals(身份) 和 Credentials (凭证) 的身份验证系统的最基本接口。

3、UsernamePasswordToken :AuthenticationToken 的接口的实现类,支持最常见的用户名/密码的身份验证

3、提交用户名/密码进行认证

Subject currentUser = SecurityUtils.getSubject();

currentUser.login(token);

4、处理认证成功和失败

认证成功:没有返回,也没有异常,通过。

认证失败,拋出异常,可以在程序中捕获并处理

七、认证顺序

这里写图片描述

八、认证过程

这里写图片描述

1、Step 1:应用程序代码调用 Subject.login 方法,传递创建好的包含终端用户的 Principals(身份)和 Credentials(凭证)的 AuthenticationToken 实例

2、Step 2:Subject 实例,通常为 DelegatingSubject(或子类)委托应用程序的 SecurityManager 通过调用 securityManager.login(token) 开始真正的验证。

3、Step3:SubjectManager 接收 token,调用内部的 Authenticator 实例调用 authenticator.authenticate(token)。 Authenticator 通常是一个 ModularRealmAuthenticator 实例,支持在身份验证中协调一个或多个Realm 实例。

4、Step 4:如果应用程序中配置了一个以上的 Realm,ModularRealmAuthenticator 实例将利用配置好的AuthenticationStrategy 来启动 Multi-Realm 认证尝试。在Realms 被身份验证调用之前,期间和以后,AuthenticationStrategy 被调用使其能够对每个Realm 的结果作出反应。

5、Step 5:每个配置的 Realm 用来帮助看它是否支持提交的AuthenticationToken。如果支持,那么支持 Realm 的 getAuthenticationInfo 方法将会伴随着提交的 token 被调用。getAuthenticationInfo 方法有效地代表一个特定 Realm 的单一的身份验证尝试。

九、注销

1、logout(注销):currentUser.logout();

2、调用 logout() 方法时,现有 Session 将失效,而且身份将失去关联(在Web 应用程序中,RememberMe cookie 将被删除)。

3、在 Subject 注销后,该 Subject 的实例被再次认为是匿名的。

4、注意:WEB 应用程序记住身份往往依靠 Cookie,然而Cookie 只能在 Response 被返回后被删除,所以建议在调用subject.logout() 后立即向终端重定向一个新的视图或页面。这样即能保证与安全相关的 Cookie 都能像预期的一样被删除。

十、授权: Authorization

1、授权:又称访问控制—控制谁有权限在应用程序中做什么。

2、授权检查的例子:用户是否能访问某个网页,编辑数据,或打使用这台打印机

3、授权的三要素:权限、角色和用户 。

4、需要在应用程序中对用户和权限建立关联:通常的做法是将权限分配给角色,然后将角色分配给一个或多个用户。

5、权限:Shiro 安全机制最核心的元素。它在应用程序中明确声明了被允许的行为。一个格式良好的权限声明可以清晰表达出用户对该资源拥有的权限。在 Shiro 中主要通过通配符表达式来完成权限的描述。

十一、角色:Role

1、角色:一个命名的实体, 通常代表一组行为或职责。 这些行为演化为在一个应用中能或者不能做的事情。角色通常分配给用户帐户

2、一个角色拥有一个权限的集合。授权验证时,需要判断当前角色是否拥有指定的权限。这种角色权限可以对该角色进行详细的权限描述。 Shiro官方推荐使用这种方式。

3、Shiro的三种授权方式

编写代码:在 Java 代码中用像 if 和 else 块的结构执行授权检查。

JDK 的注解:可以添加授权注解给 Java 方法

JSP 标签库:可以控制基于角色和权限的JSP 页面输出。

十二、编程授权

1、通过使用 subject 的方法来实现角色的判断,常用的 API:

hasRole(String roleName)

hasRoles(List roleNames)

hasAllRoles(Collection roleNames)

2、断言支持:Shiro 还支持以断言的方式进行授权验证。断言成功,不返回任何值,程序继续执行;断言失败时,将抛出异常信息。常用方法:

checkRole(String roleName) 、

checkRoles(CollectionroleNames)、

checkRoles(String… roleNames)

十三、编程授权

1、基于权限对象的实现

isPermitted(Permission p)、isPermitted(List perms)、isPermittedAll(Collection perms)

2、基于字符串的实现

if (currentUser.isPermitted(“printer:print:laserjet4400n”))

isPermitted(String perm)、isPermitted(String… perms)、isPermittedAll(String… perms)

3、权限的实现也都可以采用断言的方式,相关方法:

checkPermission(Permission p)、checkPermission(String perm)、checkPermissions(Collection perms)、checkPermissions(String… perms)

十四、授权的顺序

总目录展示

该笔记共八个节点(由浅入深),分为三大模块。

高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。该笔记将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。

一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,将用一个节点来专门讲解如何设计秒杀减库存方案。

高可用。 虽然介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。


篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),麻烦各位转发一下(可以帮助更多的人看到哟!)

由于内容太多,这里只截取部分的内容。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
记的最后,将带你思考可以从哪些环节来设计兜底方案。


篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),麻烦各位转发一下(可以帮助更多的人看到哟!)

[外链图片转存中…(img-3L07AfM6-1714745480181)]

[外链图片转存中…(img-C4S5vui6-1714745480182)]

由于内容太多,这里只截取部分的内容。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值