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. New Concept English Two 22 58

    $课文56  比声音还快! 579. Once a year, a race is held for old cars. 旧式汽车的比赛每年举行一次. 580. A lot of cars enter ...

  2. 微信逆向工程之远程操作Mac

    远程控制指令: (功能-指令-是否开启) macbook控制: 屏幕保护-ScreenSave-开启 锁屏-LockScreen-开启 休眠-Sleep-开启 关机-Shutdown-开启 重启-Re ...

  3. busybox microcom Segmentation fault

    /********************************************************************************* * busybox microco ...

  4. Plus and Square Root

    ZS the Coder is playing a game. There is a number displayed on the screen and there are two buttons, ...

  5. Java常用基础代码

    1.加载properties文件 Properties properties = new Properties();  properties.load(Properties.class.getReso ...

  6. git Permissions 0777 for '/home/xxx/.ssh/id_rsa' are too open.

    使用 git 时出现下面的问题,原因是 git 公钥的权限被修改了. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WAR ...

  7. ab压力测试之post与get请求

    安装ab工具 yum install httpd-tools 参数说明 -n:执行的请求个数,默认时执行一个请求 -c:一次产生的请求个数,即并发个数 -p:模拟post请求,文件格式为gid=2&a ...

  8. emacs配置buffer的快捷键

    emacsConfig/buffer-setting.el (global-set-key (kbd "<M-left>") 'previous-buffer) (gl ...

  9. sysbench 参数

    1)插入指定条数的数据 --events=N limit for total number of events [0] --time=N limit for total execution time ...

  10. [Android] 开发第十天

    这几天因为电脑的 USB口发生故障,一直没怎么玩 Android-Studio 后来把电脑从  Win7 -> Win10 重装后,一部分 USB口 可以使用了,然后接着开发 Android 接 ...