Shiro learning - 认证流程

Shiro认证流程

在学习认证流程之前,你应该先了解Shiro的基本使用流程

认证

  • 身份认证: 证明用户是谁。用户需要提供相关的凭证principals(身份标识)和Credentials (凭证,证明你是这个用户,可以理解成密码)
  • Principals: 用户的属性,可以有多个。但是至少有一个属性能唯一用户
  • Credentials: 证明信息,密码或者证书之类的

认证流程

  • token传给Subject.login(Token)。在调用login方法时候,内部完成了认证和授权
  • 实际上的认证是由SecurityManager调用Authenticator认证器
  • Authenticator认证器在调用实际的Realms的时候根据配置的Authentication Strategy认证策略规则判断是否认证成功

详细的认证流程

Subject是个接口,实际上的

login(AuthenticationToken var1)是由子类DelegatingSubject实现的
 1 public void login(AuthenticationToken token) throws AuthenticationException {
 2         this.clearRunAsIdentitiesInternal();
 3         Subject subject = this.securityManager.login(this, token);
 4         String host = null;
 5         PrincipalCollection principals;
 6         if (subject instanceof DelegatingSubject) {
 7             DelegatingSubject delegating = (DelegatingSubject)subject;
 8             principals = delegating.principals;
 9             host = delegating.host;
10         } else {
11             principals = subject.getPrincipals();
12         }
13
14         if (principals != null && !principals.isEmpty()) {
15             this.principals = principals;
16             this.authenticated = true;
17             if (token instanceof HostAuthenticationToken) {
18                 host = ((HostAuthenticationToken)token).getHost();
19             }
20
21             if (host != null) {
22                 this.host = host;
23             }
24
25             Session session = subject.getSession(false);
26             if (session != null) {
27                 this.session = this.decorate(session);
28             } else {
29                 this.session = null;
30             }
31
32         } else {
33             String msg = "Principals returned from securityManager.login( token ) returned a null or empty value.  This value must be non null and populated with one or more elements.";
34             throw new IllegalStateException(msg);
35         }
36     }

可以看到在第三行中

调用了ScurityManager.login

因此可以证明subject只是存储用户信息,用户的认证和授权其实是通过SecurityManager调用认证器和授权器实现的。可以把SecurityManager理解成一个中央调度器。

SecurityManager是一个接口,集成Authenticator, Authorizer, SessionManager

public interface SecurityManager extends Authenticator, Authorizer, SessionManager {
    Subject login(Subject var1, AuthenticationToken var2) throws AuthenticationException;

    void logout(Subject var1);

    Subject createSubject(SubjectContext var1);
}

SecurityManager有login方法,因此我们可以找找SecurityManager的实现类

我们可以在DefaultSecurityManager中找到Login()方法

 1  public Subject login(Subject subject, AuthenticationToken token) throws AuthenticationException {
 2         AuthenticationInfo info;//存储用户的认证信息和授权信息
 3         try {
 4             info = this.authenticate(token);//划重点
 5         } catch (AuthenticationException var7) {
 6             AuthenticationException ae = var7;
 7
 8             try {
 9                 this.onFailedLogin(token, ae, subject);
10             } catch (Exception var6) {
11                 if (log.isInfoEnabled()) {
12                     log.info("onFailedLogin method threw an exception.  Logging and propagating original AuthenticationException.", var6);
13                 }
14             }
15
16             throw var7;
17         }
18
19         Subject loggedIn = this.createSubject(token, info, subject);
20         this.onSuccessfulLogin(token, info, loggedIn);
21         return loggedIn;
22     }

第四行调用了authenticate(token).这个方法是SecurityManager的一个实现类AuthenticatingSecurityManager.java实现的,也是DefaultSecurityManager的父类

1  private Authenticator authenticator = new ModularRealmAuthenticator();//认证器
2
3    public AuthenticationInfo authenticate(AuthenticationToken token) throws AuthenticationException {
4         return this.authenticator.authenticate(token);
5     }

可以看到最终认证器的实现是 ModularRealmAuthenticator

总结: Shiro通过调用Subject的子类DelegatingSubject 的login(AuthenticationToken token)完成用户的认证和授权。实际上的认证是由SecurityManager的默认子类DefaultSecurityManager中的Login方法调用SecurityManager的另外一个子类AuthenticatingSecurityManager也同时是DefaultSecurityManager的父类authenticate(AuthenticationToken token)完成认证。并且最终的认证器类型是ModualRealmAuthenticator

原文地址:https://www.cnblogs.com/amberbar/p/10026198.html

时间: 2024-10-16 18:50:11

Shiro learning - 认证流程的相关文章

Shiro权限控制框架入门1:Shiro的认证流程以及基本概念介绍

前言:我在最开始学习Shiro这个框架时,在网上搜索到的一个介绍比较全面的教程是:<跟我学Shiro>系列教程.但是在我看了他写的前几篇文章后,我发现虽然他在这个系列教程中把shiro的一些特性介绍地非常全面详细,但是整个教程的叙述方式还是有很大缺陷的.文章与文章之间并没有很好地串联起来,每篇文章介绍的东西都过于分散了,如果是对shiro完全不了解的新手来看的话完全是一场噩梦.就像一个网友评价的这样: 看了看这个教程,看完之后都想放弃shiro了,完全看不懂,后来百度了很多别的资料才理解了sh

简单两步快速实现shiro的配置和使用,包含登录验证、角色验证、权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)

前言: shiro因为其简单.可靠.实现方便而成为现在最常用的安全框架,那么这篇文章除了会用简洁明了的方式讲一下基于spring的shiro详细配置和登录注销功能使用之外,也会根据惯例在文章最后总结一下shiro的大致配置使用流程,希望本篇文章能够后能给大家一种原来shiro这么简单的错觉感觉. 注意:该篇文章的开始是建立在一个完备的spring+mybatis的开发环境中,除了shiro之外的配置基本不会涉及到.做好自己--eguid原创文章 一.依赖的jar包 本篇文章使用shiro-1.4

2、Shiro的认证

Shiro的认证流程大体可以参考下面这幅图: 但是没有接触过shiro的同学看到上面的图片也不明白,下面我们来在代码中尝试体验Shiro的认证过程: 1.新建一个SpringBoot项目项目结构如下: ShiroframeApplicationTests代码: package com.shiro.shiroframe; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToke

Apache shiro(3)-认证过程

自己看了看前面写的几篇博客,实在是惨不忍睹.原来觉得别人这块写的不怎么样,什么都没有讲清楚.然后自己写,结果是我写的更烂.如果你被我之前的博客摧残过了,深表歉意.实践这个事情说不清楚,来来来,我们讲道理吧还是. 认证过程 认证过程也就是对用户验明正身的过程,即确认用户输入的身份信息是正确的合法的过程.我们先看看这个认证过程的图: 就如图上所说,其实这个认证过程,是在Shiro的SecurityManager中自动完成的.我们使用的时候真正做的内容是从用户输入哪里收集用户的身份信息(用户名+密码)

apache shiro的工作流程分析

本文基于shiro的web环境,用宏观(也就是不精确)的角度去理解shiro的工作流程,先看shiro官方的一张图. 和应用程序直接交互的对象是Subject,securitymanager为Subject服务.可以把Subject看成一个用户,你的所有的代码都由用户来执行.suject.execute(callable),这个callable里面就是你的代码. 一.shiro如何介入你的webapp 它是如何初始化的?servletContextListener.它是如何在每个http请求中介

Apache shiro集群实现 (三)shiro身份认证(Shiro Authentication)

一.术语介绍 Authentication:身份认证,即用户提供一些信息来证明自己的身份.如用户名和密码,licence等. Principals :主体的"标识属性",可以是任意标识,例如用户名,身份证号码,手机号码等.Principals 可以有多个,但是必须有一个主要的Principal(Primary Principal),这个标识,必须是唯一的. Credentials:凭据,即只有主体知道或具有的秘密值,例如密码或数字证书,或者某些生物特征,例如指纹,视网膜等. Princ

Shiro学习总结(3)——Apache Shiro身份认证

身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身份: principals:身份,即主体的标识属性,可以是任何东西,如用户名.邮箱等,唯一即可.一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/密码/手机号. credentials:证明

003 Shiro的认证

一 . 概述 认证:简单说就是登录,用户携带账号和密码信息通过Subject对象与shiro进行交互,看用户的身份凭证是否正确. 本节需要演示认证的流程. 二 .搭建环境 本次使用ini充当Realm对象,使用IniSecurityManager充当SecurityManager对象,这个在后面我们都会重写进行定制的,这里只是简单介绍流程. 我们的ini文件的内容: [users] trek=123 这个ini文件之中,定义了一个账号为trek,密码为123的用户. 三 .流程代码 //实现sh

Shiro 登录认证源码详解

Shiro 登录认证源码详解 Apache Shiro 是一个强大且灵活的 Java 开源安全框架,拥有登录认证.授权管理.企业级会话管理和加密等功能,相比 Spring Security 来说要更加的简单. 本文主要介绍 Shiro 的登录认证(Authentication)功能,主要从 Shiro 设计的角度去看这个登录认证的过程. 一.Shiro 总览 首先,我们思考整个认证过程的业务逻辑: 获取用户输入的用户名,密码: 从服务器数据源中获取相应的用户名和密码: 判断密码是否匹配,决定是否