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认证策略的更多相关文章

  1. Shrio多Realm认证及认证策略

    在大型的系统中,安全数据可能会存放在多个数据库中,而且每个数据的加密方式也是不一样的,那么单一的Realm就无法完成. 这时,就需要用到多Realm认证了,多Realm又涉及到认证策略,及在多个Rea ...

  2. Shiro入门学习---使用自定义Realm完成认证|练气中期

    写在前面 在上一篇文章<shiro认证流程源码分析--练气初期>当中,我们简单分析了一下shiro的认证流程.不难发现,如果我们需要使用其他数据源的信息完成认证操作,我们需要自定义Real ...

  3. Shiro入门学习之自定义Realm实现认证(四)

    一.概述 Shirom默认使用自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,而大部分情况下需要从系统数据库中读取用户信息,所以需要实现自定义Realm,Realm接口如下: ...

  4. 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 ...

  5. CDH构建大数据平台-配置集群的Kerberos认证安全

     CDH构建大数据平台-配置集群的Kerberos认证安全 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 当平台用户使用量少的时候我们可能不会在一集群安全功能的缺失,因为用户少,团 ...

  6. 配置sonarqube与gitlab sso认证集成

    1.安装插件 sonar插件地址:https://github.com/gabrie-allaigre/sonar-auth-gitlab-plugin 安装插件: 下载插件然后通过maven打包然后 ...

  7. 配置Linux使用LDAP用户认证

    配置Linux使用LDAP用户认证 本文首发:https://www.cnblogs.com/somata/p/LinuxLDAPUserAuthentication.html 我这里使用的是Cent ...

  8. Nginx 核心配置-location的登录账户认证实战篇

    Nginx 核心配置-location的登录账户认证实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用ab命令模拟网站攻击 1>.安装httpd-tools工具 ...

  9. 配置Zuul代理下游的认证

    配置Zuul代理下游的认证 您可以通过proxy.auth.*设置控制@EnableZuulProxy下游的授权行为.例: application.yml proxy: auth: routes: c ...

随机推荐

  1. OMAP4之DSP核(Tesla)软件开发学习(三)使能DSP核

    目标: 1.编译或直接获取DSP映像tesla-dsp.bin. 2.boot并使能DSP核(这个可以看启动打印或者进入/d/remoteproc/omap-rproc.0/参看dsp调试信息).   ...

  2. LNMP架构下的nginx、mysql、php的源码安装

    一.LNMP的介绍 LNMP就是Linux+Nginx+Mysql+Php这种网站服务架构.Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统,常见版本有:centos.ubun ...

  3. 理解 python 装饰器

    变量 name = 'world' x = 3 变量是代表某个值的名字 函数 def hello(name): return 'hello' + name hello('word) hello wor ...

  4. centos 搭建 docker sentry

    1.安装 http://blog.51cto.com/linuxg/2052927 2 .实际调试: 项目: <title>hghh</title> <script sr ...

  5. VirtualBox只能生成32位虚拟机

    /************************************************************************* * VirtualBox只能生成32位虚拟机 * ...

  6. Map集合统计字母次数

    Map集合练习:"asfefxAAcf34vrfdfse2-2asd--wdd"获取该字符串中,每一个字母出现的次数要求打印的结果是:a(2)c(1)...;思路:对结果分析发现, ...

  7. Codeforces 580B: Kefa and Company(前缀和)

    http://codeforces.com/problemset/problem/580/B 题意:Kefa有n个朋友,要和这n个朋友中的一些出去,这些朋友有一些钱,并且和Kefa有一定的友谊值,要求 ...

  8. 注册dll文件

    1.打开"开始-运行-输入regsvr32 XXX.dll",回车即可 2.win7 64位旗舰版系统运行regsvr32.exe提示版本不兼容 在运行regsvr32.exe的时 ...

  9. 【传输协议】HttpClient基本使用

    最近工作中是做了一个handoop的hdfs系统的文件浏览器的功能,是利用webhdfs提供的rest api来访问hdfs来与hdfs进行交互的,其中大量使用HttpClient,之前一直很忙,没什 ...

  10. Mac下忘记mysql密码怎么办

    Mac本地安装了数据库,忘记数据库密码的情况下,可以按照以下步骤进行修改密码 step1: 关闭mysql服务: 苹果->系统偏好设置->最下边点mysql 在弹出页面中 关闭mysql服 ...