Spring Security系列之基础概念

news/2024/11/7 21:07:38/

文章目录

    • 基本原理
    • Authentication接口
    • UserDetailsService 接口
    • PasswordEncoder 接口

基本原理

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;}}

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


http://www.ppmy.cn/news/547915.html

相关文章

举例说明小批量随机梯度下降的原理

小批量随机梯度下降&#xff08;Mini-batch Stochastic Gradient Descent&#xff0c;简称 Mini-batch SGD 或 MB-SGD&#xff09;是一种在深度学习中常用的优化算法。它结合了批量梯度下降&#xff08;Batch Gradient Descent&#xff0c;BGD&#xff09;和随机梯度下降&#…

Android 9.0 SecureElementService 初始化流程分析

1. 相关名词解释 NFC Near Field Communication&#xff0c;近场通信&#xff0c;一种基于13.56 MHz 的短距离通信技术。 NFCC NFC Controller&#xff0c;NFC 控制器&#xff0c;负责 NFC 无线信号的调制解调 SE Secure Element&#xff0c;安全芯片&#xff0c;拥有独立…

AndroidQ(十)Android Q功能和API

Android Q 功能和 API Android Q 为用户和开发者引入了强大的新功能。本文重点介绍面向开发者的新功能。 要了解新版 API&#xff0c;请阅读 API 差异报告或访问 Android API 参考。为醒目起见&#xff0c;将突出显示新版 API。此外&#xff0c;请务必查阅 Android Q 行为变更…

带4g无线的高性能服务器,全网通还是4G?做一个智能4G的全网通简直完美!

原标题&#xff1a;全网通还是4G&#xff1f;做一个智能4G的全网通简直完美&#xff01; 在2G/3G时代&#xff0c;语音和数据业务分别承载在两张不同的核心网上&#xff0c;控制语音相关的叫电路域(CS域&#xff1a;Circuit Switch)&#xff0c;控制数据业务相关的叫分组域(PS域…

揭秘!一个无线电黑客的玩具

在简云定眼中&#xff0c;空气里飘扬的不是北京的雾霾&#xff0c;而是醉人的无线电信号。 为了捕捉一串汽车钥匙开锁发出的无线信号&#xff0c;他需要一套“行头”。于是&#xff0c;他用了两个月的时间&#xff0c;绘制了一套电路图&#xff0c;在面包板上做电路测试&#x…

iOS 14 的新功能及评价

1. 主屏幕上的小组件 &#x1f44d; 重新设计的小组件可让您一览更多信息&#xff0c;现在还可添加到主屏幕。您可以按喜好选取不同大小和排列方式。还可以添加智能叠放&#xff0c;它会基于您的位置、活动或时间等因素显示不同小组件。 将小组件添加到 iPhone 主屏幕 “今天…

Android4.0 SDK新功能详解

Android 4.0 平台API等级&#xff1a;14 Android 4.0 是一次重要的平台发布版&#xff0c;为用户和应用程序开发者增加了大量的新特性。在下面我们将讨论的所有新特性和API中&#xff0c;因为它将 Android 3.x 版本中广泛使用的API和全息图像主题带给了小屏幕设备&#xff0c;因…

NFC技术Card Emulation模式在A ndroid系统中的应用

简介&#xff1a;近地场通讯&#xff08;&#xff2e;&#xff45;&#xff41;&#xff52; &#xff26;&#xff49;&#xff45;&#xff4c;&#xff44;&#xff23;&#xff4f;&#xff4d;&#xff4d;&#xff55;&#xff4e;&#xff49;&#xff43;&#xff41;&…