SpringSecurity认证鉴权流程

ops/2024/9/23 6:29:00/

SpringSecurity认证鉴权流程

    • SpringSecurity的认证流程
    • SpringSecurity的鉴权流程
    • 将用户交给Spring Security管理主要涉及以下几个步骤:

  • SpringSecurity的认证流程

    • 用户请求

      • 用户向应用程序发起请求,通常是访问受保护的资源(例如,一个需要登录的页面)。
    • 检查是否需要认证

      • Spring Security会检查请求的URL是否需要认证。这个检查是基于配置的访问控制规则来决定的。配置类要继承WebSecurityConfigurerAdapter
    • 触发认证

      • 如果请求的资源需要认证,Spring Security会将用户重定向到登录页面(如果未认证),或者直接处理认证(如果用户已经在认证上下文中)。
    • 认证请求

      • 用户在登录表单中输入凭据(如用户名和密码),这些凭据会被提交到Spring Security的认证处理器。
    • 处理认证

      • Spring Security的认证处理器(UsernamePasswordAuthenticationFilter 是默认的处理器),UsernamePasswordAuthenticationFilter会创建一个Authentication接口的实现类对象(UsernamePasswordAuthenticationToken)来接收到用户提交的凭据。
      • 处理器会使用认证管理器(AuthenticationManager)来验证凭据。认证管理器会将请求传递给配置的认证提供者(AuthenticationProvider–可以在配置类中启用我们自己的认证提供者)。
    • 认证提供者验证

      • 认证提供者(如DaoAuthenticationProvider)会从UsernamePasswordAuthenticationToken中拿到并验证用户提交的凭据。这通常涉及查找用户的记录,并检查密码是否匹配。
      • 认证提供者通过用户详细信息服务(UserDetailsService)加载用户的详细信息,然后进行密码验证。
    • 返回认证结果

      • 如果凭据有效,认证提供者会返回一个包含用户认证信息的Authentication(其实就是实现了Authentication接口的UsernamePasswordAuthenticationToken对象)对象。
      • 如果凭据无效,认证提供者会抛出一个认证异常(例如BadCredentialsException)。
    • 更新安全上下文

      • 认证管理器会将返回的Authentication对象存储在Spring Security的SecurityContext中。
      • SecurityContext存储在SecurityContextHolder中,以便在整个请求的生命周期内可以访问到认证信息。
    • 处理认证后的请求

      • 如果认证成功,用户会被重定向到他们最初请求的页面,或者根据配置被重定向到一个默认的成功页面/处理器。
      • 如果认证失败,用户会被重定向到登录页面/处理器,并显示适当的错误消息。
    • 权限检查

    • 认证成功后,Spring Security还会基于配置的权限规则来检查用户是否有权限访问请求的资源。这通常发生在请求被处理的阶段。

  • SpringSecurity的鉴权流程

    • 权限检查阶段
      • FilterSecurityInterceptor: 这是负责进行授权检查的主要过滤器。它会从 SecurityContext 中获取当前用户的 Authentication 对象,并使用其中的权限集合(即 getAuthorities 方法返回的集合)来决定是否允许访问特定资源。
      • AccessDecisionManager: FilterSecurityInterceptor 使用 AccessDecisionManager 来做出最终的访问决策。AccessDecisionManager 会将用户的权限集合与配置的访问控制规则进行比较,决定是否允许访问。
    • 权限投票
      • AccessDecisionVoter: 这个组件对用户是否有访问权限进行投票。它会检查用户的权限集合来决定是否允许访问请求的资源。AccessDecisionVoter 可以是基于角色、权限或自定义逻辑的投票器。
    • 访问决策
      • AccessDecisionManager 会根据所有 AccessDecisionVoter 的投票结果来做出最终的决策。如果所有投票者都允许访问,则用户可以访问请求的资源;否则,访问会被拒绝。
  • 将用户交给Spring Security管理主要涉及以下几个步骤:

    • 实现 UserDetails 接口

      • 创建一个自定义的 UserDetails 实现类,用于封装用户的详细信息,包括用户名、密码和权限等。
      java">public class CustomUserDetails implements UserDetails {private final User user; // 你的用户实体private final Collection<? extends GrantedAuthority> authorities;public CustomUserDetails(User user) {this.user = user;this.authorities = user.getRoles().stream().map(role -> new SimpleGrantedAuthority(role.getCode())).collect(Collectors.toList());}@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return authorities;}@Overridepublic String getPassword() {return user.getPassword();}@Overridepublic String getUsername() {return user.getUsername();}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return user.isEnabled();}
      }
      
    • 实现 UserDetailsService 接口

      • 创建一个 UserDetailsService 实现类,用于根据用户名加载用户的 UserDetails 实例。
      java">@Service
      public class CustomUserDetailsService implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username);if (user == null) {throw new UsernameNotFoundException("User not found");}return new CustomUserDetails(user);}
      }
      
    • 配置 Spring Security

      • 在Spring Security配置中,将 UserDetailsService 注册为一个bean,并配置认证管理器使用这个服务来进行用户认证。
      java">@Configuration
      @EnableWebSecurity
      public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate CustomUserDetailsService userDetailsService;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();}
      }
      
    • 配置密码编码器

      • 使用 BCryptPasswordEncoder 或其他密码编码器来处理用户密码的加密和验证(可以在实现了WebSecurityConfigurerAdapter的配置类中注册)。
      java">@Bean
      public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
      }
      

http://www.ppmy.cn/ops/96852.html

相关文章

《AOP实战》— 自定义注解

承接上文&#xff08;传送门 —>《面试必考》 — AOP-CSDN博客&#xff09;&#xff0c;在被面试官拷打的时候&#xff0c;会被问到一个致命问题&#xff1a;“你了解aop吗&#xff1f;有具体的使用经验吗&#xff1f;” 你&#xff1a;......... 言尽于此&#xff0c;此篇…

MySQL中的distinct和group by哪个效率更高?

前言 大家好&#xff0c;我是月夜枫~~ 一、distinct和group by的区别 1.1.作用方式和应用场景 ‌group by和‌distinct的主要区别在于它们的作用方式和应用场景。 group by用于对数据进行分组和聚合操作&#xff0c;通常与聚合函数&#xff08;如COUNT、SUM、AVG等&#xf…

【HeadFirst 设计模式】单例模式的C++实现

一、案例背景 书中给了一个巧克力工厂的例子&#xff0c;但是个人觉得关于单例模式书中给的例子过于简单&#xff0c;想要深入了解单例模式的小伙伴可以去看看这篇博客&#xff1a;【设计模式】单例模式的前世今生 二、案例分析 在很多时候&#xff0c;我们期望代码在运行过…

证书|“机器学习工程师”来了,由工业和信息化部教育与考试中心颁发,含金量高

“机器学习工程师”职业技术考试是由工业和信息化部教育与考试中心推出人才考核标准&#xff0c;在互联网、零售、金融、电信、医学、旅游等行业均有涉及&#xff0c;是专门从事数据采集、数据分析、机器学习、人工智能并能制作业务报告、提供决策的新型数据分析人才所需要的技…

Docker无法拉取镜像解决方案

vi /etc/docker/daemon.json添加如下配置 {\ "registry-mirrors": \["<https://hub.uuuadc.top>", "<https://docker.anyhub.us.kg>", "<https://dockerhub.jobcher.com>", "<https://dockerhub.icu>&q…

解锁黑科技!百度AppBuilder助你秒变开发者,轻松实现文心一言

在数字化浪潮席卷全球的今天&#xff0c;人工智能&#xff08;AI&#xff09;和大模型技术正以前所未有的速度改变着我们的世界。从自然语言处理到图像识别&#xff0c;从智能推荐到自动化决策&#xff0c;大模型以其强大的数据处理能力和学习能力&#xff0c;正成为推动科技创…

webpack和vite分别是什么,优势

Webpack 和 Vite 是两种常用的前端构建工具&#xff0c;它们各自有不同的工作方式和优点&#xff0c;适用于不同的开发场景。 1. Webpack Webpack 是一个功能强大的 JavaScript 模块打包工具。它通过静态模块分析&#xff0c;将项目的所有资源&#xff08;JavaScript、CSS、图…

数据结构——关于队列

1.队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出的特性 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队头 2.队列的…