首页 > 其他分享 >【Shiro】5.多个Realm的使用和实现

【Shiro】5.多个Realm的使用和实现

时间:2024-10-14 08:52:50浏览次数:1  
标签:Realm 多个 认证 CustomRealm2 CustomRealm1 new public Shiro

在Realm的使用中,可能使用多个Realm。比如,支持账号、密码登录;支持手机号验证码登录;支持微信登录等。

1. 创建多个自定义Realm

创建多个自定义的Realm,分别处理不同类型的认证和授权逻辑。

public class CustomRealm1 extends AuthorizingRealm {

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // 实现Realm1的授权逻辑
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        // 实现Realm1的认证逻辑
    }
}

public class CustomRealm2 extends AuthorizingRealm {

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // 实现Realm2的授权逻辑
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        // 实现Realm2的认证逻辑
    }
}

2. 配置Shiro

在Shiro配置类中配置多个Realm,并指定认证策略。

 1 @Configuration
 2 public class ShiroConfig {
 3 
 4     @Bean
 5     public SecurityManager securityManager(CustomRealm1 customRealm1, CustomRealm2 customRealm2) {
 6         DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
 7         List<Realm> realms = new ArrayList<>();
 8         realms.add(customRealm1);
 9         realms.add(customRealm2);
10         securityManager.setRealms(realms);
11 
12         // 设置认证策略,这里使用AtLeastOneSuccessfulStrategy,只要一个Realm验证成功即可
13         ModularityRealmAuthenticator authenticator = new ModularityRealmAuthenticator();
14         authenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());
15         securityManager.setAuthenticator(authenticator);
16 
17         return securityManager;
18     }
19 
20     @Bean
21     public CustomRealm1 customRealm1() {
22         return new CustomRealm1();
23     }
24 
25     @Bean
26     public CustomRealm2 customRealm2() {
27         return new CustomRealm2();
28     }
29 }

在上述代码中,创建了两个自定义的Realm:CustomRealm1和CustomRealm2,并在Shiro配置类中配置了这两个Realm。通过设置SecurityManager的Realms属性,可以指定多个Realm来处理认证和授权操作。同时,还设置了认证策略为AtLeastOneSuccessfulStrategy,表示只要一个Realm验证成功即可认证通过。
认证策略包括3种:

认证方式 描述
AtLeastOneSuccessfulStrategy
只要有一个Realm认证成功,那么认证将视为成功
FirstSuccessfulStrategy
第一个Realm认证成功,整体认证将视为成功,且后续ReaLm被忽略
AllSuccessfulStrategy
所有Realm成功,认证视为成功

标签:Realm,多个,认证,CustomRealm2,CustomRealm1,new,public,Shiro
From: https://www.cnblogs.com/luyj00436/p/18463371

相关文章

  • Wireshark 4.4.1 震撼发布!修复了多个安全漏洞,带来了诸多性能改进和新特性
    你好,这里是网络技术联盟站,我是瑞哥。网络协议分析工具领域迎来了又一重磅更新——Wireshark4.4.1版本正式发布!作为全球最受欢迎的网络协议分析工具,Wireshark在网络分析、故障排除、开发和教育中扮演着不可替代的角色。此次更新不仅修复了多个安全漏洞和已知问题,还带来......
  • 用sdkman管理多个jdk切换
    前言最近项目前后端进行升级,需要在jdk8和jdk17两个版本切换。最简单的是通过手动切换,但切换过程太繁琐,修改环境变量,达到切换目的。于是尝试其它解决方案,最终确实使用sdkman工具。  sdkman 是一款面向Java开发者的命令行工具,旨在简化操作系统上SDKs的管理。支持跨平台使用,提供......
  • C# 使用反射机制适配多个不同供应商提供的可统一接口化的行为(方法)
    1、定义一个接口(IMedicareControlFee)定义行为;定义一个适配器(IMedicareControlFeeAdapter)可应对多厂商(多态);usingSystem;usingSystem.Diagnostics;usingSystem.IO;usingJetSun.Infrastructure;usingJetSun.Infrastructure.Services;usingMicrosoft.Practices.Unity;usi......
  • 使用EasyExcel写入Excel后,将多个Excel打包为ZIP压缩包下载
    概述使用EasyExcel写入Excel后,将多个Excel打包为ZIP压缩包下载代码@GetMapping("/downloadToZip")publicvoiddownloadToZip(HttpServletResponseresponse){//设置响应头response.setContentType("application/zip");response.setCharacterEncoding(Standar......
  • winform 同时打开多个窗体,获取当前操作(Active)的窗体.
    最近工作项目中使用winform开发时碰到这样一种场景,同时打开了多个Form页面且没有隐藏Hide(),需要获取当前正在操作Avtive的页面,在被窗体调用的控件中可以使用This.ParentForm获取,但如果是普通功能类则无法使用这种方式获取,使用Form窗体静态属性Form.ActiveForm直接取值,不止为何为Nu......
  • Spring Boot 集成 RabbitMQ 多个 Broker 发送、消费消息
    1.SpringBoot集成RabbitMQ多个Broker发送、消费消息1.1.版本说明1.2.概述1.3.RabbitMQ信息1.4.Spring配置1.5.定义常量1.6.定义配置属性1.7.定义两个ConnectionFactory1.8.定义两个RabbitTemplate1.9.定义两个SimpleRabbitListenerContainerFacto......
  • MySQL,多个timestamp字段的建表语句建表失败
    我使用的MySQL版本为5.7.42SELECTVERSION(); 建表语句示例CREATETABLEOrders(order_idBIGINTPRIMARYKEYCOMMENT'订单唯一标识符,主键',a_timeTIMESTAMP,b_timeTIMESTAMP)COMMENT='订单表,用于存储订单信息'; 报错为:Invaliddefaultvaluefor'b_time......
  • 一个服务器拥有多个ip有什么作用?
    原文链接:https://www.hzjcp.com/3566.html第一次见一台服务器有多个外网ip的情况,在此记录下。一个服务器拥有多个ip有什么作用?服务器多IP意味着一个服务器拥有多个IP地址。IP地址是互联网上设备的唯一标识符,用于在设备之间进行通信。拥有多个IP地址可以使服务器在多个网站或服......
  • 如何用PyQt5创建多个窗口,同时获取多个U盘内的文件的名称,并分别在对应窗口打印文件名,要
    在PyQt5中,你可以使用QThread创建多个线程来并行处理每个U盘的文件名获取任务。每个线程负责扫描一个U盘的文件,同时在主窗口显示结果。以下是一个示例代码,用来创建多个窗口,同时在每个窗口中显示各自的U盘文件名:每个窗口使用QWidget。使用QThread创建后台线程获取U......
  • Arduino UNO R3自学笔记24 之 Arduino如何使用MAX7219控制多个数码管?
    注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。前言:前面学习了单个数码管的控制,但是在大多场合一个数码管是满足不了使用场景的,因此对于数码管的学习,应该学会用尽可能少的端口去驱动更多的数码管,在此情况下,MAX7219比较适合我们使用。1.MAX7219引脚及功能介绍......