Spring Security 概念基础 验证流程

认证&授权

  • 认证:确定是否为合法用户
  • 授权:分配角色权限(分配角色,分配资源)

认证管理器(Authentication Manager)

负责认证用户是否为合法

访问决策管理器(Access Decision Manager)

负责判定一个安全实体是不是有适当的访问权限

认证

    //认证
    user request
    ↓
    (AbstractClass) AbstractAuthenticationProcessingFilter
        |-获取用户提供个信息并创建一个部分完整的 Authentication 对象来传递凭证信息

        (实现类)UsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter
            |-do: create o.s.s.core.Authentication (生成用户信息 UsernamePasswordAuthenticationToken)
    ↓
    (Interface) AuthenticationManager
        |-校验用户的凭证信息,用户无效会抛出一个特定的异常 成功会补全Authentication的信息(如权限信息)

        (实现类)ProviderManager implements AuthenticationManager
            |-注入 (interface)AuthenticationProvider
                |-注入 (Interface) UserDetails
                    |-获取 o.s.s.core.userdetails.UserDetails  获取用户信息 

            |-验证用户是否合法,验证用户是否拥有权限
                valid credentials(验证合法) /invalid credentials (用户无效)-> Throw AuthenticationException
                            ↓
                添加其他信息如权限 (o.s.s.core.GrantedAuthority)
                            ↓
                        验证成功

o.s.s.core.Authentication(用户信息)

  • 它存储安全实体的标识、密码以及认证请求的上下文信息。
  • 它还包含用户认证后的信息 (可能会包含一个 UserDetails 的实例)。
  • 通常不会被扩展,除非是为了支持某种特定类型的认证。
    //返回安全实体的唯一标识(如,一个用户名)
    Object getPrincipal()
    //返回安全实体的凭证信息
    Object getCredentials()
    //得到安全实体的权限集合,根据认证信息的存储决定的。
    List<GrantedAuthority> getAuthorities()
    //返回一个跟认证相关的安全实体细节信息
    Object getDetails()

UserDetails

  • 为了存储一个安全实体的概况信息,包含名字、e-mail、电话号码等。
  • 通常会被扩展以支持业务需求。

o.s.s.core.GrantedAuthority(权限集合)

    //返回安全实体的唯一标识(如,一个用户名)
    Object getPrincipal()                       

    //返回安全实体的凭证信息
    Object getCredentials()                     

    //得到安全实体的权限集合,根据认证信息的 存储决定的。
    List<GrantedAuthority> getAuthorities()     

    //返回一个跟认证 供者相关的安全实体细节 信息
    Object getDetails()                         

AuthenticationException(用户验证无效异常)

  • authentication 存储关联认证请求的Authentication实例;
  • extraInformation 根据特定的异常可以存储额外的信息。如UsernameNotFoundException 在这个域上存储了用户名。
Exception 解析 extraInformation
BadCredentialsException 如国没有供用户名或者密码与认证存储中用户名对应的密码不匹配 UserDetails
LockedException 如果用户的账号被发现锁定了 UserDetails
UsernameNotFoundException 如果用户名不存在或者用户没有被授予的GrantedAuthority String(包含用户名)

授权

    //访问资源(即授权管理)
    user request url
        ↓
    AbstractSecurityInterceptor (委托一个AccessDecisionManager完成授权的判断)
        ↓(获取配置的权限信息)
    FilterInvocationSecurityMetadataSource
        ↓
    AccessDecisionManager(需要获取AccessDecisionVoters)
        ↓
    返回决策结果

o.s.s.access.AccessDecisionManager


    //判断是否支持当前的请求。
    supports()

    //核实访问是否被允许以及请求是否能够被接受。该方法实际上没有返回值,通过抛出异常来表明对 请求访问的拒绝。
    decide()

o.s.s.access.AccessDecisionVoter (投票决策器)

Grant (ACCESS_GRANTED)

投票器允许对资源的访问

Deny (ACCESS_DENIED)

投票器拒绝对资源的访问

Abstain (ACCESS_ABSTAIN)

投票器对是否能够访问做了弃权处理(即没有做出决定)。

AccessDeniedException (以下情形返回该异常)

  • AuthenticationProvider 当供的凭证不合法 或用户失效、过期;
  • DaoAuthenticationProvider 当访问 DAO 数据 存储时出错;
  • RememberMeServices 当 remember me cookie 被篡改; 各种特定的认证类(CAS、NTLM 等)在用户 特定的场景下。
  • 当配置的 Voter 投票 拒绝访问(注意这可能在任何投票场景下)

Spring Security 概念基础 验证流程的更多相关文章

  1. Spring Security 的注册登录流程

    Spring Security 的注册登录流程 数据库字段设计 主要数据库字段要有: 用户的 ID 用户名称 联系电话 登录密码(非明文) UserDTO对象 需要一个数据传输对象来将所有注册信息发送 ...

  2. 自定义Spring Security的身份验证失败处理

    1.概述 在本快速教程中,我们将演示如何在Spring Boot应用程序中自定义Spring Security的身份验证失败处理.目标是使用表单登录方法对用户进行身份验证. 2.认证和授权(Authe ...

  3. spring security关闭http验证 和 springboot 使用h2数据库

    spring security关闭http验证 最近在跑demo的过程中,访问swagger页面的时候需要验证登录,记得在之前写的代码中是关闭了security验证,无需登录成功访问,直接在appli ...

  4. Spring Security OAuth2 完全解析 (流程/原理/实战定制) —— Client / ResourceServer 篇

    一.前言 本文假设读者对 Spring Security 本身原理有一定程度的了解,假设对 OAuth2 规范流程.Jwt 有基础了解,以此来对 SpringSecurity 整合 OAuth2 有个 ...

  5. Spring Security在登录验证中增加额外数据(如验证码)

    在使用Spring Security框架过程中,经常会有这样的需求,即在登录验证时,附带增加额外的数据,如验证码.用户类型等.下面将介绍如何实现. 注:我的工程是在Spring Boot框架基础上的, ...

  6. [spring security] spring security 4 基础Demo

    依赖包: <properties> <junit.version>4.11</junit.version> <spring.version>4.1.6. ...

  7. spring security结合数据库验证用户-XML配置方式

    之前的用户信息我们都是使用的内存用户,测试例子可以,实际中使用肯定不行,需要结合数据库进行验证用户.这就是本节的重点: 项目目录如下:  在之前的项目中的依赖中添加两个依赖: <dependen ...

  8. 认证与授权】Spring Security系列之认证流程解析

    上面我们一起开始了Spring Security的初体验,并通过简单的配置甚至零配置就可以完成一个简单的认证流程.可能我们都有很大的疑惑,这中间到底发生了什么,为什么简单的配置就可以完成一个认证流程啊 ...

  9. Spring Security Source Code -- 验证标准流程

    除了初始阶段: 主干验证流程链: MyInvocationSecurityMetadataSource.getAttributes(Object) line: 43     MyFilterSecur ...

随机推荐

  1. jquery之效果操作

    jQuery操作之效果 效果一共分五大类 一.基本 二.滑动 三.淡入淡出 四.自定义 五.设置 咱们先来看一下基本类 一.基本又分为 show() hide() toggle() html代码 &l ...

  2. VR市场爆炸-VR全景智慧城市

    随着VR的火爆,越来越多的企业开始关注这种高新技术,也有越来越多VR虚拟现实公司应运而生,但是VR虚拟现实公司真的那么好做吗?虽然VR虚拟现实拥有巨大的市场潜力,但是同时它也非常烧钱,如果VR虚拟现实 ...

  3. 在Excel上写程序(ExcelEx)

    首先要说明的是:Ctrl+D,是执行框选的的扩展函数+号,一个单元格里多个函数用+号分隔*号,相当于链式操作(没法子,公式里不能写"."号) 虽还有很大的局限性,至少很多小程序和数 ...

  4. webpack 2.x 配置

    以下展示2.x 配置文件信息 v1 迁移至 v2 官方有更详细的说明 具体详见 https://webpack.js.org/guides/migrating/ 只列举常用到参数进行描述, 或者我在使 ...

  5. DOM知识梳理

    DOM 我们知道,JavaScript是由ECMAScript + DOM + BOM组成的.ECMAScript是JS中的一些语法,而BOM主要是浏览器对象(window)对象的一些相关知识的集合. ...

  6. (转)Windows下tail命令工具(转)

    因为随笔无转载按钮,先说明原文地址是: Windows 下 tail 查看日志命令工具分享 使用方法: 下载后解压,把tail.exe 复制到 目录:C:\Windows\System32 下 文件下 ...

  7. 推荐五款Android 应用的自动化测试工具

    如今自动化测试已经应用到每天的测试中.这不足为奇,因为自动化测试在测试过程中节约了时间,还能避免包括人为因素造成的测试错误和遗漏. 自动化测试工具选择很多.一些是开源的,一些非常贵.一些自动化工具是几 ...

  8. yield详解

    生成器generator 一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器 yeild能暂时的保留函数的运行位置,每次 ...

  9. 高性能迷你React框架anu在低版本IE的实践

    理想是丰满的,现实是骨感的,react早期的版本虽然号称支持IE8,但是页面总会不自觉切换到奇异模式下,导致报错.因此必须让react连IE6,7都支持,这才是最安全.但React本身并不支持IE6, ...

  10. Bottle源码阅读笔记(二):路由

    前言 程序收到请求后,会根据URL来寻找相应的视图函数,随后由其生成页面发送回给客户端.其中,不同的URL对应着不同的视图函数,这就存在一个映射关系.而处理这个映射关系的功能就叫做路由.路由的实现分为 ...