Spring Security系列之基础概念

文章目录

    • 基本原理
    • Authentication接口
    • UserDetailsService 接口
    • PasswordEncoder 接口
    • @EnableWebSecurity 注解

基本原理

SpringSecurity 本质是一个过滤器链,采用的是责任链设计模式。

  • 启动的时候,控制台打印出来的 DefaultSecurityFilterChain 过滤器:
org.springframework.security.web.session.DisableEncodeUrlFilter@2c9a6717, 
org.springframework.security.web.session.ForceEagerSessionCreationFilter@7b3cde6f, 
org.springframework.security.web.session.ForceEagerSessionCreationFilter@506aabf6, 
// 将 Security 上下文与 Spring Web 中用于处理异步请求映射的 WebAsyncManager 进行集成。
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@6d091cad, 
// 在每次请求处理之前将该请求相关的安全上下文信息加载到 SecurityContextHolder 中,然后在该次请求处理完成之后,将SecurityContextHolder 
// 中关于这次请求的信息存储到一个“仓储”中,然后将SecurityContextHolder 中的信息清除,例如在 Session 中维护一个用户的安全信息就是这个过滤
// 器处理的。
org.springframework.security.web.context.SecurityContextPersistenceFilter@5cbd94b2, 
// 用于将头信息加入响应中。
org.springframework.security.web.header.HeaderWriterFilter@3330f3ad, 
// 用于处理退出登录。
org.springframework.security.web.authentication.logout.LogoutFilter@24a2e565, 
// 自定义过滤器
com.tyr.security.support.authentication.sms.SmsCodeAuthenticationFilter@7c663eaf, 
// 对 /login 的 POST 请求做拦截,校验表单中用户名,密码。
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@12a2585b, 
// 自定义过滤器
com.tyr.security.support.authentication.jwt.JwtAuthenticationFilter@3bb5ceb, 
// 自定义过滤器
com.tyr.security.support.authentication.mail.MailAuthenticationFilter@1e692555, 
// 用来处理请求的缓存。
org.springframework.security.web.savedrequest.RequestCacheAwareFilter@6824b913, 
// 主要是包装请求对象 request。
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@756aadfc, 
// 当用户没有登录而直接访问资源时, 从 cookie 里找出用户的信息, 如果 Spring Security 能够识别出用户提供的 remember me cookie, 
// 用户将不必填写用户名和密码, 而是直接登录进入系统,该过滤器默认不开启。
org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter@3b95a6db,
// 检测 SecurityContextHolder 中是否存在Authentication 对象,如果不存在为其提供一个匿名 Authentication。 
org.springframework.security.web.authentication.AnonymousAuthenticationFilter@3ba0ae41, 
// 管理 session 的过滤器
org.springframework.security.web.session.SessionManagementFilter@f425231, 
// 异常过滤器,用来处理在认证授权过程中抛出的异常
org.springframework.security.web.access.ExceptionTranslationFilter@b46e103, 
// 一个方法级的权限过滤器, 基本位于过滤链的最底部。
org.springframework.security.web.access.intercept.FilterSecurityInterceptor@3a2e9f5b
  • Spring Security 采取过滤链实现认证与授权,只有当前过滤器通过,才能进入下一个过滤器。

在这里插入图片描述

  • 绿色部分是认证过滤器,需要我们自己配置,可以配置多个认证过滤器。认证过滤器可以使用 Spring Security 提供的认证过滤器,也可以自定义过滤器(例如:邮箱,短信验证等)。认证过滤器要在 configure(HttpSecurity http)方法中配置,没有配置不生效。

Authentication接口

principal

  • 要进行身份验证的主体的身份。对于带有用户名和密码的身份验证请求,这将是用户名。调用方应填充身份验证请求的主体。
  • AuthenticationManager 实现通常会返回包含更丰富信息的身份验证作为应用程序使用的主体。许多身份验证提供程序将创建一个UserDetails对象作为主体。

credentials

  • 证明主体正确的凭据。这通常是一个密码,但可以是与 相关的 AuthenticationManager任何内容。调用方应填充凭据。

details

  • 存储有关身份验证请求的其他详细信息。这些可能是 IP 地址、证书序列号等。
  • 有关身份验证请求的其他详细信息,如果未使用,则为 null 。

authorities

  • 已授予委托人的权限。
  • 实现应确保对返回的集合数组的修改不会影响 Authentication 对象的状态,或使用不可修改的实例。
  • 授予主体的权限,或空集合(如果令牌尚未经过身份验证),从不为null。

authenticated

  • 令牌是否已经通过认证。
  • true:令牌应该被信任 或 false:令牌不应该被信任。

UserDetailsService 接口

  • 当什么也没有配置的时候,账号和密码是由 Spring Security 定义生成的。而在实际项目中账号和密码都是从数据库中查询出来的。 所以我们要通过自定义逻辑控制认证逻辑。
  • 如果需要自定义逻辑时,只需要实现 UserDetailsService 接口即可。
public interface UserDetailsService {/**根据用户名定位用户。在实际实现中,搜索可能区分大小写或不区分大小写,具体取决于实现实例的配置方式。在这种情况下, UserDetails 返回的   		 对象可能具有与实际请求的用户名不同的大小写。形参:username – 标识需要其数据的用户的用户名。返回值:完全填充的用户记录(从不 null)抛出:UsernameNotFoundException – 如果找不到用户或用户没有授权*/// UserDetails 系统默认的用户主体UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;}

UserDetails

public interface UserDetails extends Serializable {// 表示获取登录用户所有权限Collection<? extends GrantedAuthority> getAuthorities();String getPassword();String getUsername();// 表示判断账户是否过期boolean isAccountNonExpired();// 表示判断账户是否被锁定boolean isAccountNonLocked();// 表示凭证{密码}是否过期boolean isCredentialsNonExpired();// 表示当前用户是否可用boolean isEnabled();
}

PasswordEncoder 接口

/*** Service interface for encoding passwords.** The preferred implementation is {@code BCryptPasswordEncoder}.** @author Keith Donald*/
public interface PasswordEncoder {// 表示把参数按照特定的解析规则进行解析String encode(CharSequence rawPassword);// 表示验证从存储中获取的编码密码与编码后提交的原始密码是否匹配。如果密码匹配,则返回 true;如果不匹配,则返回 false。// 第一个参数表示需要被解析的密码。第二个参数表示存储的密码。boolean matches(CharSequence rawPassword, String encodedPassword);// 表示如果解析的密码能够再次进行解析且达到更安全的结果则返回 true,否则返回false。默认返回 false。default boolean upgradeEncoding(String encodedPassword) {return false;}}

@EnableWebSecurity 注解

  • 在 Spring boot 应用中使用 Spring Security,用到@EnableWebSecurity注解。注解 @EnableWebSecurity 类型的类,构成了 Spring Security 的配置。
  • @EnableWebSecurity 是 Spring Security 用于启用Web安全的注解。典型的用法是该注解用在某个Web安全配置类上。
  • 注解起到如下效果 :
    • 控制Spring Security是否使用调试模式(通过注解属性debug指定),缺省为false,表示缺省不使用调试模式。
    • 导入 WebSecurityConfiguration,用于配置Web安全过滤器FilterChainProxy。
    • 若干个WebSecurityConfigurerAdapter作用于一个WebSecurity生成一个最终使用的web安全过滤器FilterChainProxy。
    • 如果是Servlet 环境,导入WebMvcSecurityConfiguration。
    • 如果是OAuth2环境,导入OAuth2ClientConfiguration。
    • 使用注解@EnableGlobalAuthentication启用全局认证机制。

你知道的越多,你不知道的越多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/3161.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openfeign实现远程调用

一 openfeign简介 Feign 是声明性(注解)web 服务客户端它使编写 web 服务客户端更加容易请创建一个接口并对其进行注解.它具有可插入注解支持&#xff0c;包括Feign注解和JAXRS注解Feign 还支持可插拔编码器和解码器。Spring cloud 添加了对Spring MVC注解的支持&#xff0c;并…

GPT-4 参加2023年高考数学,人工智能对话机器人和人类对决,快谁速度快

ChatGPT从入门到精通&#xff0c;一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定 让ChatGPT帮你高效实现职场办公&#xff01;行动起来吧。 【点击查看更多知识】ChatGPT从入门到精通&am…

使用SSH远程直连Docker容器

文章目录 1. 下载docker镜像2. 安装ssh服务3. 本地局域网测试4. 安装cpolar5. 配置公网访问地址6. SSH公网远程连接测试7.固定连接公网地址8. SSH固定地址连接测试 转载自cpolar极点云文章&#xff1a;SSH远程直连Docker容器 在某些特殊需求下,我们想ssh直接远程连接docker 容器…

【STM32智能车】电机控制

【STM32智能车】电机控制 PWMPWM基本用法&#xff1a; 电机驱动基本控制基本状态 欢迎收看由咸鱼菌工作室出品的STM32系列教程。本篇内容主要电机控制 PWM 我们要控制电机&#xff0c;就要先了解一下PWM。 PWM(Pulse Width Modulation)控制——脉冲宽度调制技术&#xff0c;通…

2022前端趋势报告(下)

前端博主&#xff0c;热衷各种前端向的骚操作&#xff0c;经常想到哪就写到哪&#xff0c;如果有感兴趣的技术和前端效果可以留言&#xff5e;博主看到后会去代替大家踩坑的&#xff5e; 主页: oliver尹的主页 格言: 跌倒了爬起来就好&#xff5e; 一、前言 本文内容来自于《St…

go 调试利器之pprof指标分析

文章目录 概要一、指标类型1.1、堆栈指标1.2、CPU指标分析1.3、http-pprof 二、go tool pprof2.1、可视化2.2、CPU火焰图 概要 Go语言原生支持对于程序运行时重要指标或特征进行分析。pprof是其中一种重要的工具&#xff0c;其不仅可以分析程序运行时的错误&#xff08;内存泄…

html5前端学习2

一篇思维题题解&#xff1a; 第五周任务 [Cloned] - Virtual Judge (vjudge.net) http://t.csdn.cn/SIHdM 快捷键&#xff1a; CtrlAltDown 向下选取 CtrlAltUp 向上选取&#xff08;会出现多个光标&#xff0c;可以同时输入&#xff09; CtrlEnter …

24个Jvm面试题总结及答案

1.什么是Java虚拟机&#xff1f;为什么Java被称作是“平台无关的编程语言”&#xff1f; Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台&#xff0c;而不需要程序员为每…

html实现多种风格的时间轴(附源码)

文章目录 1.设计来源1.1 对称风格时间轴1.2 横向风格时间轴1.3 回忆风格时间轴1.4 记事风格时间轴1.5 简易风格时间轴1.6 科技风格时间轴1.7 列表风格时间轴1.8 跑道风格时间轴1.9 人物风格时间轴1.10 容器风格时间轴1.11 沙滩风格时间轴1.12 双边风格时间轴1.13 图文风格时间轴…

基于原生 js 实现今日新闻网站

完整资料进入【数字空间】查看——baidu搜索"writebug" 一、今日新闻网站设计报告 1.1 1 设计思路 该网站设计大部分都是基于原生 js 实现。基本思想为首先将基本的页面架构包括 header&#xff0c;导航条写好。之后根据后台 PHP 请求接口请求返回 JSON 格式数据后…

【Linux 系统编程】Linux背景介绍 及 基本指令详解(一)

文章目录 1. Linux背景1.1 发展史1.2 开源精神1.3 官网1.4 企业应用现状1.5 发行版本1.6 os概念&#xff0c;定位 2. Linux下基本指令2.1 几个常用基本命令演示2.2 某些概念的解释2.3 ls 指令2.4 pwd 指令2.5 cd 指令Linux的目录结构绝对路径与相对路径cd 常用快捷命令 2.6 tou…

30_小驰私房菜_qcom根据关键日志信息,快速排查问题

根据关键日志信息,能帮忙我们快速的定位和分析问题。是一项必须得掌握的技能。 一、查看当前是哪个app调用的相机 logcat 关键字“CameraService::connect” 如下面日志打印所示,我们还可以看到是调用的Camera API 1还是Camera API 2. 二、查看配流情况 1) qcom 平台 …