Spring Security 概念基础 验证流程
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 概念基础 验证流程的更多相关文章
- Spring Security 的注册登录流程
Spring Security 的注册登录流程 数据库字段设计 主要数据库字段要有: 用户的 ID 用户名称 联系电话 登录密码(非明文) UserDTO对象 需要一个数据传输对象来将所有注册信息发送 ...
- 自定义Spring Security的身份验证失败处理
1.概述 在本快速教程中,我们将演示如何在Spring Boot应用程序中自定义Spring Security的身份验证失败处理.目标是使用表单登录方法对用户进行身份验证. 2.认证和授权(Authe ...
- spring security关闭http验证 和 springboot 使用h2数据库
spring security关闭http验证 最近在跑demo的过程中,访问swagger页面的时候需要验证登录,记得在之前写的代码中是关闭了security验证,无需登录成功访问,直接在appli ...
- Spring Security OAuth2 完全解析 (流程/原理/实战定制) —— Client / ResourceServer 篇
一.前言 本文假设读者对 Spring Security 本身原理有一定程度的了解,假设对 OAuth2 规范流程.Jwt 有基础了解,以此来对 SpringSecurity 整合 OAuth2 有个 ...
- Spring Security在登录验证中增加额外数据(如验证码)
在使用Spring Security框架过程中,经常会有这样的需求,即在登录验证时,附带增加额外的数据,如验证码.用户类型等.下面将介绍如何实现. 注:我的工程是在Spring Boot框架基础上的, ...
- [spring security] spring security 4 基础Demo
依赖包: <properties> <junit.version>4.11</junit.version> <spring.version>4.1.6. ...
- spring security结合数据库验证用户-XML配置方式
之前的用户信息我们都是使用的内存用户,测试例子可以,实际中使用肯定不行,需要结合数据库进行验证用户.这就是本节的重点: 项目目录如下: 在之前的项目中的依赖中添加两个依赖: <dependen ...
- 认证与授权】Spring Security系列之认证流程解析
上面我们一起开始了Spring Security的初体验,并通过简单的配置甚至零配置就可以完成一个简单的认证流程.可能我们都有很大的疑惑,这中间到底发生了什么,为什么简单的配置就可以完成一个认证流程啊 ...
- Spring Security Source Code -- 验证标准流程
除了初始阶段: 主干验证流程链: MyInvocationSecurityMetadataSource.getAttributes(Object) line: 43 MyFilterSecur ...
随机推荐
- 如何升级php版本---从php5.5.12 升级php7.1.5 wamp实践
1.从官网下载一个php7.1.5 2.将刚下载的压缩包解压缩,修改命名为php7.1.5,即php+版本号. 3.将这个文件夹放在wamp/bin/php 目录下. 4.将原来版本的php5.5.1 ...
- 弹性盒布局display:flex详解
一:弹性盒子 随着响应式设计的流行,网站开发者在设计网页布局时往往要考虑到页面在适配不同分辨率的浏览器时其内部组件位置大小都会产生变化,因此需要设计者根据窗口尺寸来调整布局,从而改变组件的尺寸和位置, ...
- JVM、GC与HashMap
阿里巴巴突然来了个面试邀请电话,问了些java底层的东西,不知所措,所以专门花了些时间做了下学习,顺便记录下,好记性不如烂笔头. 一.对JAVA的垃圾回收机制(GC)的理解 不同于C/C++需要手工释 ...
- haproxy-代码阅读-内存管理
haproxy内存池概述 内存池按照类型分类,每个类型的内存池都有一个名字,用链表记录空闲的内存块,每个内存块大小相等,并按照16字节对齐. haporxy用pool_head 结构记录内存池 str ...
- 2016.02.01日,UdoOS系统项目正式开通了
2016.02.01日,UdoOS系统项目正式开通了,源代码即将开放 Copyright (c) 2016
- 谷歌安装器扫描时提示“需要root权限”,不用root也可以的!
能FQ的用户会用谷歌服务,一般的新手机没有安装谷歌框架,但是在用谷歌安装器安装谷歌市场时会提示"需要root权限",我用的是360手机,按照下面的教程搞好了: 安装完GSM包就可以 ...
- <bits/stdc++.h>头文件介绍(包含源代码)
注:转自http://blog.csdn.net/charles_dong2/article/details/56909347,同为本人写的,有部分修改. 之前在一个小OJ上刷题时发现有人是这么写的: ...
- CSS小技巧-为内盒子添加margin-top时,会带着父盒子一起下来,如何解决?
1.为父盒子添加一个padding 2.为父盒子添加一个border 3.为父盒子添加一个overflow:hidden
- 【Python中if __name__ == '__main__': 的解析】
在很多Python代码中,在代码的最下方会看到 if __name__ == '__main__':,这段代码到底有什么用呢? 在理解这个语句的作用前,需要知道的是,一般的Python文件后缀为.p ...
- h5 + nginx + php 视频上传之突破文件大小受限的解决办法
一.环境: CentOS 6.8 nginx 1.8.0 php 7.0.10 二.背景 基于 nginx + php 的 h5 项目,上传视频的时候,如果视频太大,会上传失败. 三.正文 一份视频传 ...