shiro概述(二)基础组件

一、Realm:

1、介绍:在Shiro中,Realm是一个非常灵活和强大的安全组件,它能够与各种数据源进行集成,满足各种安全需求。通过实现自定义的Realm,可以轻松地定制身份验证、授权和加密逻辑,实现更加细粒度的访问控制。
2、作用:Realm主要作用是身份验证和授权。当一个Subject需要进行身份验证时,它会调用SecurityManager中的authenticate方法,该方法会委托给所有配置的Realm来进行身份验证。当验证成功后,Realm会返回一个SimpleAuthenticationInfo对象,其中包含了身份验证信息(如用户名、密码等),这些信息会在会话管理中使用。Realm还可以用于加密和解密操作。例如,使用Realm中的CredentialsMatcher接口可以对密码进行加密和验证。

3、扩展:Shiro提供了多个默认的Realm实现,包括:

(1)IniRealm:通过一个INI配置文件来存储用户、角色和权限信息。
(2)JdbcRealm:通过JDBC来访问数据库,存储用户、角色和权限信息。
(3)ActiveDirectoryRealm:通过LDAP协议来访问Active Directory,存储用户、角色和权限信息。
(4)LdapRealm:通过LDAP协议来访问LDAP服务器,存储用户、角色和权限信息。
(5)TextConfigurationRealm:通过一个文本文件来存储用户、角色和权限信息。

(6)也可以通过继承AbstractAuthorizingRealm或AbstractAuthenticatingRealm来创建自定义的Realm实现。

(7)AuthorizingRealm:实际使用一般继承这种即可。

4、Realm的使用:在使用Realm时,需要将其配置到SecurityManager中,有两种方法:

(1)配置文件方法:shiro提供ini配置文件,进行IOC容器管理,当然可以配置realm

[main]
securityManager.realms = $iniRealm, $jdbcRealm[iniRealm]
# IniRealm的配置[jdbcRealm]
# JdbcRealm的配置
IniRealm iniRealm = new IniRealm("classpath:shiro.ini");
JdbcRealm jdbcRealm = new JdbcRealm();
securityManager.setRealms(Arrays.asList(iniRealm, jdbcRealm));

(2)编程方式:

CustomRealm customRealm = new CustomRealm();
DefaultSecurityManager securityManager = new DefaultSecurityManager();
securityManager.setRealm(customRealm);
SecurityUtils.setSecurityManager(securityManager);

二、AuthenticationToken:

1、作用:用于收集用户提交的身份(如用户名)及凭据(如密码):

public interface AuthenticationToken extends Serializable {Object getPrincipal();Object getCredentials();
}

 2、扩展接口/实现类:

(1)RememberMeAuthenticationToken接口提供了boolean isRememberMe()功能;

(2)HostAuthenticationToken接口提供了String getHost();获取用户主机的功能

(3)UsernamePasswordToken:

public class UsernamePasswordToken implements HostAuthenticationToken, RememberMeAuthenticationToken

三、AuthenticationInfo:

1、介绍:表示Subject存储的只和鉴权/登录过程相关的账户信息;和AuthenticationToken、AuthorizationInfo的比较:

(1)AuthenticationToken表示登录时提交的凭据信息(可能匹配,也可能不匹配AuthenticationInfo);

(2)AuthenticationInfo表示已经验证过且存储在系统中的账户信息;

(3)AuthorizationInfo表示访问控制数据,如角色和权限;

2、核心方法:

public interface AuthenticationInfo extends Serializable {PrincipalCollection getPrincipals();Object getCredentials();
}

3、实现子类:

public interface AuthenticationInfo extends Serializablepublic interface Account extends AuthenticationInfo, AuthorizationInfopublic class SimpleAccount implements Account, MergableAuthenticationInfo, SaltedAuthenticationInfo, Serializablepublic interface MergableAuthenticationInfo extends AuthenticationInfopublic class SimpleAccount implements Account, MergableAuthenticationInfo, SaltedAuthenticationInfo, Serializablepublic class SimpleAuthenticationInfo implements MergableAuthenticationInfo, SaltedAuthenticationInfopublic interface SaltedAuthenticationInfo extends AuthenticationInfopublic class SimpleAccount implements Account, MergableAuthenticationInfo, SaltedAuthenticationInfo, Serializablepublic class SimpleAuthenticationInfo implements MergableAuthenticationInfo, SaltedAuthenticationInfo

(1)Account:同时继承AuthenticationInfoAuthorizationInfo接口,表示单个Realm中单个账户的鉴权和授权;

(2)MergableAuthenticationInfo:支持合并其它AuthenticationInfo的实现,即允许本类实例是来自多个Realm的账户数据的聚合或者组合;支持多Realm鉴权;

(3)SaltedAuthenticationInfo:表示支持使用盐值进行哈希凭据信息的账户信息,主要为了支持需要哈希用户凭据的环境;盐值通常从安全的伪随机数生成器生成,和账户信息一起安全地存储,和账户的凭据一起维护;

(4)SimpleAuthenticationInfo:MergableAuthenticationInfo的简单实现;一般情况使用这种即可。

(5)SimpleAccount:Account的简单实现,内部使用SimpleAuthenticationInfoSimpleAuthorizationInfo实例实现Account接口;

四、PrincipalCollection:

 shiro可以同时配置多个realm,所以身份信息可能就有多个,因此提供了PrincipalCollection用于聚合这些身份信息。

public interface PrincipalCollection extends Iterable, Serializable {Object getPrimaryPrincipal();<T> T oneByType(Class<T> var1);<T> Collection<T> byType(Class<T> var1);List asList();Set asSet();Collection fromRealm(String var1);Set<String> getRealmNames();boolean isEmpty();
}

在Realm中,PrincipalCollection.getPrimaryPrincipal()得到的类型即为doGetAuthenticationInfo身份认证接口设置返回的principals身份类型,可能是字符串(用户名),也可能是对象(用户对象)。

五、AuthorizationInfo:

1、作用:用于聚合授权信息:

public interface AuthorizationInfo extends Serializable {Collection<String> getRoles();Collection<String> getStringPermissions();Collection<Permission> getObjectPermissions();
}

在使用AuthorizingRealm时,如果身份验证成功,在授权时就通过doGetAuthorizationInfo方法获取角色/权限信息用于授权验证。

2、使用:大多数时候使用SimpleAuthorizationInfo即可。

六、Subject:

1、介绍:是Shiro的认证授权组件 提供当前用户信息(角色 授权),然后进行登录、退出、权限验证等,我们常将一个Subject对象称之为一个用户。

2、获取Subject:使用SecurityUtils.getSubject()可以获得当前的Subject。

3、主要接口/作用:

(1)获取身份信息

    Object getPrincipal();PrincipalCollection getPrincipals();

(2)身份验证:

   void login(AuthenticationToken var1) throws AuthenticationException;boolean isAuthenticated();boolean isRemembered();

 (3)授权验证:

    boolean isPermitted(String var1);boolean isPermitted(Permission var1);boolean[] isPermitted(String... var1);boolean[] isPermitted(List<Permission> var1);boolean isPermittedAll(String... var1);boolean isPermittedAll(Collection<Permission> var1);void checkPermission(String var1) throws AuthorizationException;void checkPermission(Permission var1) throws AuthorizationException;void checkPermissions(String... var1) throws AuthorizationException;void checkPermissions(Collection<Permission> var1) throws AuthorizationException;boolean hasRole(String var1);boolean[] hasRoles(List<String> var1);boolean hasAllRoles(Collection<String> var1);void checkRole(String var1) throws AuthorizationException;void checkRoles(Collection<String> var1) throws AuthorizationException;void checkRoles(String... var1) throws AuthorizationException;

(4)会话:

Session getSession();//相当于getSession(true)
Session getSession(boolean var1);

(5)退出:

void logout();

(6)Run As

void runAs(PrincipalCollection var1) throws NullPointerException, IllegalStateException;boolean isRunAs();
PrincipalCollection getPreviousPrincipals();PrincipalCollection releaseRunAs();

(7)多线程

<V> V execute(Callable<V> var1) throws ExecutionException;void execute(Runnable var1);<V> Callable<V> associateWith(Callable<V> var1);Runnable associateWith(Runnable var1);

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

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

相关文章

docker安装RabbitMQ3.8.34

&#x1f60a; 作者&#xff1a; 瓶盖子io &#x1f496; 主页&#xff1a; 瓶盖子io-CSDN博客 a.拉取rabbitmq镜像 docker pull rabbitmq:3.8.34-management b.根据镜像创建容器 在yml配置文件中port是5672 访问是ip:15672 docker run --name rabbitmq -d -p 5672:5672 -…

JavaScript如果实现一段文字的高亮显示

JavaScript实现将一段文字检索高亮显示,效果如下: 实现方法:调用highlight函数 highlight("JavaScript如果实现一段文字的高亮显示", "高亮")实战代码实现: function highlight(value, search)

node.js express JWT token生成与校验

目录 JWT header&#xff08;标头&#xff09; payload&#xff08;有效负载&#xff09; signature&#xff08;签名&#xff09; 访问令牌&#xff08;token&#xff09; express jwt生成、验证 生成jwt 验证jwt JWT JWT 是轻量级的数据交换格式&#xff0c;相对于传…

5分钟搞懂Kubernetes:轻松理解所有组件

Kubernetes 首先&#xff0c;我想强调的是&#xff0c;在学习任何一项知识时&#xff0c;官方文档都是最重要的资源&#xff1a;Kubernetes 文档 | Kubernetes 官方文档提供了详尽、准确的信息&#xff0c;帮助我们深入了解和掌握这个技术。因此&#xff0c;如果你真的对Kubern…

Jenkins 添加节点报错

报错日志 Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: hudson/remoting/Launcher has been compiled by a more recent version of the Java Runtime (cl…

Python接口测试 requests.post方法中data与json参数区别

引言 requests.post主要参数是data与json&#xff0c;这两者使用是有区别的&#xff0c;下面我详情的介绍一下使用方法。 Requests参数 1. 先可以看一下requests的源码&#xff1a; def post(url, dataNone, jsonNone, **kwargs):r"""Sends a POST request.…

c# 字段和属性(get、set、init)

目录 基本概念&#xff1a; 个人理解&#xff1a; 访问器的默认写法&#xff1a; set与init无法共存&#xff1a; init&#xff1a; 必须在类的实例化时给字段赋值的情况(require属性): 基本概念&#xff1a; “字段”就是类内成员变量&#xff0c;一般为了隐藏数据&…

Guarded Suspension(担保挂起)设计模式

当线程访问某个对象时&#xff0c;发现条件不满足&#xff0c;暂时挂起等待条件满足时再次访问。Guarded Suspension模式是一个非常基础的模式&#xff0c;主要关注&#xff08;临界值&#xff09;不满足时将操作的线程正确挂起&#xff0c;以防止出现数据不一致或者操作超过临…

抗EMC干扰高精度隔离放大器ISO EC 系列

SunYuan ISO EC系列模拟信号隔离放大器是一种有较强抗EMC干扰特性的电容耦合隔离混合集成电路。该放大器采用了全新的调制-解调电容耦合隔离技术&#xff0c;模块中信号以数字信号的方式通过电容隔离层进行传输&#xff0c;通过数字调制和电容耦合隔离方式保持信号的完整性&…

【深度学习】注意力机制(三)

本文介绍一些注意力机制的实现&#xff0c;包括EMHSA/SA/SGE/AFT/Outlook Attention。 【深度学习】注意力机制&#xff08;一&#xff09; 【深度学习】注意力机制&#xff08;二&#xff09; 【深度学习】注意力机制&#xff08;四&#xff09; 【深度学习】注意力机制&a…

gd32F303串口接收的几种方式

一、串口接受到换行符停止 #include "usart.h"UCHAR arr_rxData[1024]{0};//存储串口接收的数据 UINT arr_len0;//串口已经接收数据的字节数个数 USART_RX_FLAG rxFlgFLASE;//默认串口未接收到数据void USART2_Init(void) {rcu_periph_clock_enable(RCU_GPIOB); //e…

Google为什么它还没有开发出ChatGPT,如何反超,小公司创新的产品如何反超巨头 行业巨头如何防止被小公司或创新型公司的产品超越

Google虽然收购了Geoffrey Hinton及其在多伦多大学的两名研究生组成的公司DNNresearch Inc.&#xff0c;但为什么它还没有开发出类似ChatGPT的产品&#xff0c;可能有以下几个原因&#xff1a; 不同的研发方向&#xff1a;Google在人工智能领域的研发方向可能与OpenAI&#xff…

大创项目推荐 深度学习 opencv python 公式识别(图像识别 机器视觉)

文章目录 0 前言1 课题说明2 效果展示3 具体实现4 关键代码实现5 算法综合效果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的数学公式识别算法实现 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学…

基于Spring Boot+Vue.js的停车场收费管理系统 需求分析

1 用户&#xff08;收费员&#xff09; 1.1 主页 1.1.1 摄像头实时捕捉画面&#xff0c;如果有车牌号则识别出车牌&#xff08;如&#xff1a;京A11111&#xff09;&#xff0c;通过车牌底色识别出小型车&#xff08;蓝色&#xff09;、大型车&#xff08;黄色&#xff09;。…

java面试题-Redis缓存穿透、雪崩、击穿

远离八股文&#xff0c;面试大白话&#xff0c;通俗且易懂 看完后试着用自己的话复述出来。有问题请指出&#xff0c;有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来&#xff0c;大家一起解决。 java面试题汇总-目录-持续更新中 这个问的挺多的&#x…

《对话品牌》——科技与时尚的融合

本期节目《对话品牌》栏目组邀请到了江西先禾服饰有限公司董事长吁火兰女士参加栏目录制&#xff0c;分享其企业故事&#xff0c;树立品牌形象&#xff0c;提升品牌价值&#xff01; 节目嘉宾&#xff1a;吁火兰 节目主持人&#xff1a;杨楠 节目播出平台&#xff1a;中央新…

【已解决】java 无法将类 XX类中的构造器 X应用到给定类型

原因&#xff1a; 实际参数列表和形式参数列表长度不同 解决方法&#xff1a; 给类添加AllArgsConstructor注解即可。

Xcode编写基于C++的动态连接库(dylib)且用node-ffi-napi测试

创建一个dylib工程示例 在 Xcode 中创建一个动态链接库&#xff08;.dylib 文件&#xff09;的步骤如下&#xff1a; 打开 Xcode&#xff1a; 打开 Xcode 应用程序。 创建新的工程&#xff1a; 选择 "Create a new Xcode project"&#xff0c;或者使用菜单 File &g…

MagicAnimate:Temporally consistent human image animation using diffusion model

1.Introduction 本文研究了任务形象动画人物&#xff0c;旨在根据特定的运动序列生成一个具有特定参考身份的视频。现有的人物图像动画的数据驱动方法可以基于所使用的生成主干模型分为两类&#xff0c;1.基于GAN&#xff0c;通常使用变形函数将参考图变形为目标姿态&#xff0…

JVM虚拟机系统性学习-JVM调优之通过gceasy分析GC日志对堆、元空间、线程堆栈和垃圾回收器进行调优

通过 gceasy工具对生成的 GC 日志进行分析 这里使用的 JDK 版本为 JDK8&#xff01; 在分析 GC 日志时&#xff0c;可以同时采用多种工具&#xff08;Arthas、gceasy、JVM 连接 Graphana 监控&#xff09;进行分析&#xff0c;避免某种工具分析不准确 gceasy 每个月只可以免费…