帮忙么网 > Spring > 当前页面

Spring security的执行流程

2025-02-27 NEW个对象

Spring Security 的执行流程: 

1、认证(Authentication):先经过认证过滤器 -> 认证管理器 -> 成功后存入 SecurityContextHolder 
2、授权(Authorization):访问资源时经过授权过滤器 -> 权限判断 -> 允许访问或拒绝访问 
3、所有请求都经过 SecurityFilterChain 过滤

如果项目里需要集成Spring security:

1、定义UserDetailService,用来加载用户信息
2、自定义一个tokenfilter,检验token,将用户信息加载到SecurityContextHolder

3、权限认证

@PreAuthorize是 Spring Security 内置的前置权限注解,添加在接口方法上,声明需要的权限,实现访问权限的控制。

执行详细流程:

[客户端请求] --> [SecurityFilterChain] 过滤器链
  --> [身份认证] UsernamePasswordAuthenticationFilter / JwtAuthenticationFilter
    --> [AuthenticationManager] 认证管理器
      --> [AuthenticationProvider] 认证提供者
        --> [UserDetailsService] 查询用户信息
        --> [PasswordEncoder] 验证密码
    --> [认证成功] 存入 SecurityContextHolder
    --> [授权检查] FilterSecurityInterceptor
      --> [AccessDecisionManager] 权限判断
        --> [投票器] RoleVoter/WebExpressionVoter
      --> [授权成功] 返回资源
      --> [授权失败] 返回 403

login接口里有这么一行代码:

authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));


AuthenticationManager 默认使用的是 ProviderManager,它是 AuthenticationManager 的一个默认实现。ProviderManager 管理一个或多个 AuthenticationProvider,并依次调用它们进行认证。


默认配置:


ProviderManager 默认会注册一个 DaoAuthenticationProvider,这是 Spring Security 中最常用的认证提供者。DaoAuthenticationProvider 会根据 UserDetailsService 来加载用户数据,并通过 PasswordEncoder 来验证密码。


AuthenticationManager 工作原理:


AuthenticationManager authenticationManager = new ProviderManager(Arrays.asList(new DaoAuthenticationProvider()));

ProviderManager 会依次检查各个 AuthenticationProvider 是否支持当前的 Authentication 类型。如果支持,则交给相应的 AuthenticationProvider 来进行认证。

相关文章

  • Spring如何通过三级缓存解决循环依赖问题

    三级缓存: 一级缓存(singletonObjects):存储已经完全初始化的单例 Bean 对象。 二级缓存(earlySingletonObjects):存储已经实例化但尚未完全初始化的单例 Bean 对象。 三级缓存(singletonFactories):存储 Bean 对象的创建工厂,用于在创建过程中检测循环依赖。

    NEW个对象 2024-12-17

  • 事务传播

    事务传播

    NEW个对象 2025-01-01

  • FactoryBean与BeanFactory区别

    1、BeanFactory是Spring框架的核心接口,它是Spring IoC容器的基础。BeanFactory负责创建、配置和管理Bean的生命周期。 2、FactoryBean是一个特殊的Bean,它自身是一个Bean,同时也充当了一个工厂的角色,如果返回的bean是FactoryBean,那么会调用它的getObject()方法获取对象。

    NEW个对象 2025-01-17