Shrio03 Authenticator、配置多个Realm、SecurityManager认证策略
1 Authenticator 简介
1.1 层次结构图
1.2 作用
职责是验证用户帐号,是ShiroAPI中身份验证核心的入口点;接口中声明的authenticate方法就是用来实现认证逻辑的。
1.3 源代码
1.4 authenticate
》该方法是实现认证逻辑的。
》如果验证成功,将返回AuthenticationInfo验证信息;此信息中包含了身份及凭证;如果验证失败将抛出相应的 AuthenticationException 实现。
2 ModularRealmAuthenticator
2.1 关系图
2.2 作用
认证策略接口,自定义认证策略时只需要继承该类即可(PS:一般使用默认的三种策略即可)
2.3 三种策略
》FirstSuccessfulStrategy:只要有一个Realm验证成功即可,只返回第一个Realm身份验证 成功的认证信息,其他的忽略;
》AtLeastOneSuccessfulStrategy:只要有一个Realm验证成功即可,和FirstSuccessfulStrategy 不同,返回所有 Realm 身份验证成功的认证信息;
》AllSuccessfulStrategy:所有Realm验证成功才算成功,且返回所有Realm身份验证成功的 认证信息,如果有一个失败就失败了。
》注意:ModularRealmAuthenticator 默认使用 AtLeastOneSuccessfulStrategy 策略。
3 代码实现
3.1 环境搭建
创建一个Maven项目,并引入shiro、junit相关依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.0</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
3.2 自定义Realm
》实现Realm接口即可
》MyRealm01
package com.xunyji.shirotest.realm; import org.apache.shiro.authc.*;
import org.apache.shiro.realm.Realm; /**
* @author AltEnter
* @create 2019-01-21 16:21
* @desc 简易Realm01
**/
public class MyRealm01 implements Realm { /** 用户名 */
public static final String USERNAME = "fury1";
/** 用户密码 */
public static final String PASSWORD = "111111"; public String getName() {
return "MyRealm01";
} public boolean supports(AuthenticationToken token) {
if (token instanceof UsernamePasswordToken) {
return true;
}
return false;
} public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal();
String password = new String((char[]) token.getCredentials());
if (USERNAME.equals(username) && PASSWORD.equals(password)) {
return new SimpleAuthenticationInfo(username, password, getName());
} else {
throw new RuntimeException("MyRealm01 - 用户名或者密码错误");
}
} }
》MyRealm02
package com.xunyji.shirotest.realm; import org.apache.shiro.authc.*;
import org.apache.shiro.realm.Realm; /**
* @author AltEnter
* @create 2019-01-21 16:21
* @desc 简易Realm01
**/
public class MyRealm02 implements Realm { /** 用户名 */
public static final String USERNAME = "fury2";
/** 用户密码 */
public static final String PASSWORD = "222222"; public String getName() {
return "MyRealm02";
} public boolean supports(AuthenticationToken token) {
if (token instanceof UsernamePasswordToken) {
return true;
}
return false;
} public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal();
String password = new String((char[]) token.getCredentials());
if (USERNAME.equals(username) && PASSWORD.equals(password)) {
return new SimpleAuthenticationInfo(username, password, getName());
} else {
throw new RuntimeException("MyRealm02 - 用户名或者密码错误");
}
} }
3.3 思路
》实例化Realm
》实例化SecurityManager
》实例化ModularRealmAuthenticator
》实例化FirstSuccessfulStrategy
》给ModularRealmAuthenticator对象设置认证策略
》给SecurityManager设置认证对象
》给SecurityManager设置Realm对象
》注意:SecurityManager必须先设置Authenticator再设置Realm,否则会报错
3.4 源代码
package com.xunyji.shirotest.autenticatedemo; import com.xunyji.shirotest.realm.MyRealm01;
import com.xunyji.shirotest.realm.MyRealm02;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.pam.AllSuccessfulStrategy;
import org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy;
import org.apache.shiro.authc.pam.FirstSuccessfulStrategy;
import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.subject.Subject;
import org.junit.Test; import java.util.Collections;
import java.util.HashSet;
import java.util.Set; /**
* @author AltEnter
* @create 2019-01-21 16:26
* @desc
**/
public class TestDemo {
@Test
public void test01() {
// 01 获取Realm对象
MyRealm01 myRealm01 = new MyRealm01();
MyRealm02 myRealm02 = new MyRealm02(); // 02 获取SecurityManager对象
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
// 03 设置SecurityManager对象的认证策略
ModularRealmAuthenticator modularRealmAuthenticator = new ModularRealmAuthenticator();
modularRealmAuthenticator.setAuthenticationStrategy(new FirstSuccessfulStrategy());
// modularRealmAuthenticator.setAuthenticationStrategy(new AllSuccessfulStrategy());
defaultSecurityManager.setAuthenticator(modularRealmAuthenticator); // 04 设置SecurityManager的Realm
// defaultSecurityManager.setRealm(myRealm01);
// defaultSecurityManager.setRealm(myRealm02);
Set<Realm> realmHashSet = new HashSet<Realm>();
realmHashSet.add(myRealm01);
realmHashSet.add(myRealm02);
defaultSecurityManager.setRealms(realmHashSet); SecurityUtils.setSecurityManager(defaultSecurityManager);
Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("fury1", "111111");
// UsernamePasswordToken token = new UsernamePasswordToken("fury2", "222222"); subject.login(token); System.out.println(String.format("认证结果为:%s", subject.isAuthenticated())); subject.logout(); System.out.println(String.format("认证结果为:%s", subject.isAuthenticated())); }
}
Shrio03 Authenticator、配置多个Realm、SecurityManager认证策略的更多相关文章
- Shrio多Realm认证及认证策略
在大型的系统中,安全数据可能会存放在多个数据库中,而且每个数据的加密方式也是不一样的,那么单一的Realm就无法完成. 这时,就需要用到多Realm认证了,多Realm又涉及到认证策略,及在多个Rea ...
- Shiro入门学习---使用自定义Realm完成认证|练气中期
写在前面 在上一篇文章<shiro认证流程源码分析--练气初期>当中,我们简单分析了一下shiro的认证流程.不难发现,如果我们需要使用其他数据源的信息完成认证操作,我们需要自定义Real ...
- Shiro入门学习之自定义Realm实现认证(四)
一.概述 Shirom默认使用自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,而大部分情况下需要从系统数据库中读取用户信息,所以需要实现自定义Realm,Realm接口如下: ...
- Shiro集成多个Realm,认证都不通过返回y configured realms. Please ensure that at least one realm can authenticate these tokens.
异常内容:Authentication token of type [class org.apache.shiro.authc.UsernamePasswordToken] could not be ...
- CDH构建大数据平台-配置集群的Kerberos认证安全
CDH构建大数据平台-配置集群的Kerberos认证安全 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 当平台用户使用量少的时候我们可能不会在一集群安全功能的缺失,因为用户少,团 ...
- 配置sonarqube与gitlab sso认证集成
1.安装插件 sonar插件地址:https://github.com/gabrie-allaigre/sonar-auth-gitlab-plugin 安装插件: 下载插件然后通过maven打包然后 ...
- 配置Linux使用LDAP用户认证
配置Linux使用LDAP用户认证 本文首发:https://www.cnblogs.com/somata/p/LinuxLDAPUserAuthentication.html 我这里使用的是Cent ...
- Nginx 核心配置-location的登录账户认证实战篇
Nginx 核心配置-location的登录账户认证实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用ab命令模拟网站攻击 1>.安装httpd-tools工具 ...
- 配置Zuul代理下游的认证
配置Zuul代理下游的认证 您可以通过proxy.auth.*设置控制@EnableZuulProxy下游的授权行为.例: application.yml proxy: auth: routes: c ...
随机推荐
- Alpha阶段敏捷冲刺---Day1
一.Daily Scrum Meeting照片 二.今天冲刺情况反馈 1.昨天已完成的工作 昨天我们组全体成员在五社区五号楼719召开了紧急会议,在会议上我们梳理了编写这个程序的所有流程,并且根 ...
- HBase查询优化——持续更新
Scan:setBatch,setCaching,setCacheBlocks public void setBatch(int batch) public void setCaching(int c ...
- LNMP环境下独立安装Mysql5.7.18 并对数据库文件进行本地物理迁移 (需暂停数据库服务方式)
前几天读研时候的同学要我帮忙给解决一个问题,就是Redhat服务器下面安装了LNMP,并且由于分区的划分不当导致MySQL数据库中存放数据库的盘区内空间被急剧消耗,由于该应用主要是数据分析及备份所用, ...
- BZOJ4012: [HNOI2015]开店【动态点分治】
Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...
- 在WPF中使用CefSharp嵌入浏览器(转)
在WPF中使用CefSharp嵌入浏览器 日常开发中,我们需要将一些Web页面嵌入到桌面客户端软件中.下面我们使用CefSharp嵌入浏览器来实现. 首先先介绍一下CefSharp嵌入式浏览器,它 ...
- 纯php实现中秋博饼游戏(2):掷骰子并输出结果
这篇是纯php实现中秋博饼游戏系列博文(2) 上文是:纯php实现中秋博饼游戏(1):绘制骰子图案 http://www.cnblogs.com/zqifa/p/php-dice-1.html要纯ph ...
- xmlns和xsi之schemaLocation
appplicationContex.xml文件报错:元素 "util:constant" 的前缀 "util" 未绑定 在根节点添加了“xmlns:util= ...
- ASP.NET 迭代控件获得行号
如何获取Repeater的当前行号,其实Repeater自身就带有这个获取当前行号的属性,而无需程序员绑定这个行号.到底要怎么实现呢?其实使用Repeater中的 Container.ItemInde ...
- 编译sass,遇到报错error style.scss (Line 3: Invalid GBK character "\xE5")
今天学习sass,写了一行中文注释,结果却遇到了报错: cmd.exe /D /C call C:/Ruby23-x64/bin/scss.bat --no-cache --update style. ...
- Log4j(2)--日志等级
Log4j根据日志信息的重要程度,分OFF.FATAL.ERROR.WARN.INFO.DEBUG.ALL 当然再细分的话 还有 FATAL(严重错误), 但是Log4j官方建议实际实用的话,Log4 ...