Spring Security系列之基本原理
上篇:Spring Security系列之入门案例
一、SpringSecurity 基本原理
1、SpringSecurity
本质是一个过滤器链:从启动是可以获取到过滤器链
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter org.springframework.security.web.context.SecurityContextPersistenceFilter org.springframework.security.web.header.HeaderWriterFilter org.springframework.security.web.csrf.CsrfFilter org.springframework.security.web.authentication.logout.LogoutFilter org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter org.springframework.security.web.savedrequest.RequestCacheAwareFilter org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter org.springframework.security.web.authentication.AnonymousAuthenticationFilter org.springframework.security.web.session.SessionManagementFilter org.springframework.security.web.access.ExceptionTranslationFilter org.springframework.security.web.access.intercept.FilterSecurityInterceptor
代码底层流程:重点看三个过滤器:
(1)FilterSecurityInterceptor过滤器
是一个方法级的权限过滤器, 基本位于过滤链的最底部。
super.beforeInvocation(fi) 表示查看之前的filter 是否通过。
fi.getChain().doFilter(fi.getRequest(), fi.getResponse());表示真正的调用后台的服务。
(2)ExceptionTranslationFilter过滤器
是个异常过滤器,用来处理在认证授权过程中抛出的异常
(3)UsernamePasswordAuthenticationFilter过滤器
对/login的POST请求做拦截,校验表单中用户名,密码。
2、UserDetailsService接口讲解
当什么也没有配置的时候,账号和密码是由Spring Security定义生成的。而在实际项目中账号和密码都是从数据库中查询出来的。 所以我们要通过自定义逻辑控制认证逻辑。
如果需要自定义逻辑时,只需要实现UserDetailsService接口即可。接口定义如下:
返回值UserDetails ,这个类是系统默认的用户“主体”
// 表示获取登录用户所有权限
Collection<? extends GrantedAuthority> getAuthorities();
// 表示获取密码
String getPassword();
// 表示获取用户名
String getUsername();
// 表示判断账户是否过期
boolean isAccountNonExpired();// 表示判断账户是否被锁定
boolean isAccountNonLocked();// 表示凭证{密码}是否过期
boolean isCredentialsNonExpired();
// 表示当前用户是否可用
boolean isEnabled();
以下是UserDetails实现类
以后我们只需要使用User 这个实体类即可!
方法参数 username
表示用户名。此值是客户端表单传递过来的数据。默认情况下必须叫username,否则无法接收。
3、PasswordEncoder 接口讲解
// 表示把参数按照特定的解析规则进行解析
String encode(CharSequence rawPassword); //表示验证从存储中获取的编码密码与编码后提交的原始密码是否匹配。如果密码匹配,则返回true;
//如果不匹配,则返回false。第一个参数表示需要被解析的密码。第二个参数表示存储的密码。
boolean matches(CharSequence rawPassword, String encodedPassword); // 表示如果解析的密码能够再次进行解析且达到更安全的结果则返回true,否则返回false。
//默认返回false。
default boolean upgradeEncoding(String encodedPassword) { return false;
}
3.1、接口实现类
但是也实现BCryptPasswordEncoder
BCryptPasswordEncoder是Spring Security官方推荐的密码解析器,平时多使用这个解析器。
BCryptPasswordEncoder是对bcrypt强散列方法的具体实现。是基于Hash算法实现的单向加密。可以通过strength控制加密强度,默认10
3.2、查用方法演示
代码如下:
package org.apache;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;@SpringBootTest
class SpringsecuritydemoApplicationTests {@Testvoid contextLoads() {// 创建密码解析器BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();// 对密码进行加密String security = bCryptPasswordEncoder.encode("security");// 打印加密之后的数据System.out.println("加密之后数据:\t"+security);// 判断原字符加密后和加密之前是否匹配boolean result = bCryptPasswordEncoder.matches("security", security);// 打印比较结果System.out.println("比较结果:\t"+result);}}
打印输出信息:
Spring Security系列之基本原理相关推荐
- Spring Security系列之Spring Social实现微信社交登录(九)
社交登录又称作社会化登录(Social Login),是指网站的用户可以使用腾讯QQ.人人网.开心网.新浪微博.搜狐微博.腾讯微博.淘宝.豆瓣.MSN.Google等社会化媒体账号登录该网站. 前言 ...
- spring security系列一:架构概述
一直以来都想好好写一写spring security 系列文章,每每提笔又不知何处下笔,又赖于spring security体系强大又过于繁杂,且spring security 与auth2.0结合的 ...
- Spring Security系列教程03--创建SpringSecurity项目
前言 在上一章节中,一一哥 已经带大家认识了Spring Security,对其基本概念已有所了解,但是作为一个合格的程序员,最关键的肯定还是得动起手来,所以从本篇文章开始,我就带大家搭建第一个Spr ...
- Spring Security系列教程21--会话管理之实现集群会话
前言 现在我们已经掌握了如何防御会话固定攻击,处理会话过期,对会话进行并发控制等,但是这些会话处理手段都是针对单机环境下的,在现在的大型项目中,很多时候都是采用分布式开发方案.一旦涉及到分布式方案,就 ...
- 爆破专栏丨Spring Security系列教程之Spring Security的四种权限控制方式
原创:一一哥 前言: 在前面的章节中,一一哥 已经给大家介绍了Spring Security的很多功能,在这些众多功能中,我们知道其核心功能其实就是认证+授权. 在前面我们分别基于内存模型.基于默认的 ...
- Spring Security系列教程解决Spring Security环境中的跨域问题
原创:千锋一一哥 前言 上一章节中,一一哥 给各位讲解了同源策略和跨域问题,以及跨域问题的解决方案,在本篇文章中,我会带大家进行代码实现,看看在Spring Security环境中如何解决跨域问题. ...
- Spring Security系列教程11--Spring Security核心API讲解
前言 经过前面几个章节的学习,一一哥 带大家实现了基于内存和数据库模型的认证与授权,尤其是基于自定义的数据库模型更是可以帮助我们进行灵活开发.但是前面章节的内容,属于让我们达到了 "会用&q ...
- Spring Security系列教程-Spring Security核心API讲解
前言 经过前面几个章节的学习,一一哥 带大家实现了基于内存和数据库模型的认证与授权,尤其是基于自定义的数据库模型更是可以帮助我们进行灵活开发.但是前面章节的内容,属于让我们达到了 "会用&q ...
- Spring Security系列(11)- Security5.0版本Oauth2开放平台环境搭建
前言 上篇文档,我们了解了OAuth2.0的相关知识,接下来我们搭建一个自己的Oauth2开放平台. 从流程图中,可以看到,后台需要搭建一个认证服务器,负责用户登录.第三方授权等功能,还需要搭建自己的 ...
- 千锋教育威哥学Java——爆破专栏丨Spring Security系列教程之解决Spring Security环境中的跨域问题
前言 上一章节中,一一哥 给各位讲解了同源策略和跨域问题,以及跨域问题的解决方案,在本篇文章中,我会带大家进行代码实现,看看在Spring Security环境中如何解决跨域问题. 需要更多教程,微信 ...
最新文章
- PC-lint 的代码实例
- Java CountDownLatch的两种常用场景
- 网页元素坐标表示及坐标计算方法
- windows下使用MinGW+msys编译ffmpeg
- Careercup - Microsoft面试题 - 5428361417457664
- 分布式数据库中间件使用经验分享
- jquery右下角自动弹出关闭层
- Q96:PT(3):基于噪声的纹理(Noise-Based Textures)(0)——概述
- DSP及海思嵌入式板实现gb28181
- linux nvm node 权限不够_centos部署node+mongodb环境
- SQL常用替换字符串值的5种方法
- 使用鸿蒙原生做游戏适配问题
- mysql mtq_Mysql 入门学习指南
- NVIDIA显卡硬件技术交流整理
- 《点燃我,温暖你》爱心代码复现
- LINUX最小系统安装过程中的Partition Disks分配问题
- python对英语的要求_对英文【对英文英语头条】- 对英文知识点 - 中企动力
- SMTP 协议邮件发送工具封装
- 站在巨人的肩膀上,用Node+ChatGPT模块实现一个接口
- CC00154.bigdatajava——|JavaMySQL.高级.V26|——|MySQL.v27|锁机制_锁概念介绍|