博客
关于我
security详解
阅读量:798 次
发布时间:2019-03-25

本文共 5521 字,大约阅读时间需要 18 分钟。

Spring Security + OAuth2.0入门及核心原理解析

作为一个刚入门学习Spring Security和OAuth2.0的开发者,我在理解其核心工作流程和配置方式时遇到了许多困惑。本文将从零开始,详细解析Spring Security及其与OAuth2.0的整合,帮助大家逐步掌握这一技术栈。

1. Spring Security的自动注入机制

Spring Security通过Spring Boot的自动注入特性来简化配置和初始化。SpringBoot在启动时会扫描所有jar包下的spring.factories,利用工具类将其转换为Map<String, List<Object>>。这一过程涉及到几个关键类的自动注入,包括SecurityAutoConfigurationSecurityRequestMatcherProviderAutoConfigurationUserDetailsServiceAutoConfigurationSecurityFilterAutoConfiguration

1.1 SecurityAutoConfiguration

SecurityAutoConfiguration类通过@ConditionalOnClass注解确保其在存在DefaultAuthenticationEventPublisher类的环境中被注入。它还通过@Import导入了几个核心配置类,如SpringBootWebSecurityConfigurationWebSecurityEnablerConfigurationSecurityDataConfiguration。这些配置类负责初始化Spring Security的核心组件。

1.2 配置类的作用

  • SpringBootWebSecurityConfiguration:主要负责将WebSecurityConfigurerAdapter添加到Spring容器中,并初始化默认的安全配置。
  • WebSecurityEnablerConfiguration:检查是否有SecurityFilterChain存在,若无则自动配置必要的安全组件。
  • SecurityDataConfiguration:处理安全上下文扩展,确保安全表达式能够正确工作。

2. Filter的注入与Tomcat的集成

在实际应用中,我们需要将Spring Security的Filter注入到Tomcat环境中。以下是这一过程的关键步骤:

2.1 Filter的注入

Spring Security通过FilterChain的注入机制,将配置好的Filter(如DelegatingFilterProxy)注册到Tomcat的ServletContext中。其流程如下:

  • 自动注入:通过SecurityFilterAutoConfiguration类,利用@AutoConfigureAfter注解,在初始化时注册DelegatingFilterProxy
  • FilterChainProxy的初始化WebSecurityEnablerConfiguration类在初始化时,通过performBuild()方法创建FilterChainProxy,将所有定义的安全Filter组合到一起。
  • 2.2 Filter的运行流程

    当HTTP请求到达Tomcat时,请求会被CoyoteAdapter处理,进入Spring的管道处理流程。具体来说,请求会经历以下阶段:

  • 请求接收:由Acceptor类接收并处理socket请求。
  • Filter链处理pipeline负责协调各个Filter的执行顺序,包括如SecurityContextPersistenceFilterLogoutFilter等核心安全Filter。
  • 过滤器执行DelegatingFilterProxy作为顶层Filter,负责协调子Filter的执行,确保每个Filter依次处理请求。
  • 3. Security流程详解

    3.1 认证流程

  • 用户身份验证

    • UsernamePasswordAuthenticationFilter处理表单提交的认证信息,与提供的用户身份进行比对。
    • 失败时,DefaultLoginPageGeneratingFilter生成登录页面;成功则跳转到指定的登录成功页面。
  • Session管理

    • SessionManagementFilter管理 HttpSession,检查请求中是否已登录,并根据需要更新session statuses。
  • 授权流程

    • FilterSecurityInterceptor通过AccessDecisionManager检查用户是否有访问请求资源的权限。
    • 权限不足时,调用AccessDeniedHandler执行相应的拒绝处理逻辑。
  • 3.2 Filter执行顺序

    Filter的执行顺序由VirtualFilterChain决定,顺序包括:

  • WebAsyncManagerIntegrationFilter:处理异步请求时的上下文同步。
  • SecurityContextPersistenceFilter:维护Security上下文。
  • LogoutFilter:处理退出逻辑。
  • UsernamePasswordAuthenticationFilter:处理标准的Username-Password认证。
  • DefaultLoginPageGeneratingFilter:生成登录页面。
  • DefaultLogoutPageGeneratingFilter:生成退出页面。
  • BasicAuthenticationFilter:处理HTTP基本认证。
  • RequestCacheAwareFilter:处理缓存。
  • SecurityContextHolderAwareRequestFilter:关联Security上下文。
  • SessionManagementFilter:管理 HttpSession。
  • ExceptionTranslationFilter:处理异常,特别是AuthenticationException和AccessDeniedException。
  • FilterSecurityInterceptor:进行最终的权限检查和二次认证。
  • 4. 配置方法

    4.1 自定义认证 Provided

    WebSecurityConfigurerAdapterconfigure方法中,通过authenticationProvider()链式配置自定义的AuthenticationProvider(如DaoAuthenticationProvider),支持多种认证方式,如数据库认证、OAuth认证等。

    4.2 自定义UserDetailsService

    使用UserDetailsService来实现用户认证的逻辑,配合passwordEncoder()设置密码编码策略。

    4.3 自定义FilterSecurityInterceptor

    通过重写configure方法,可以自定义FilterSecurityInterceptor的行为,比如自定义权限决策逻辑。

    4.4 自定义AccessDeniedHandler

    configure方法中注入自定义的AccessDeniedHandler,对权限不足的情况做出个性化处理。

    4.5 路由配置示例

    configure方法中,可以对路由资源进行精细化控制,例如:

    http.httpBasic() .and().csrf().disable() .authorizeRequests() .antMatchers("/login").permitAll() .antMatchers("/oauth/**").permitAll() .anyRequest().authenticated() .and() .formLogin() .and() .logout() .permitAll();

    5. 重要元素关系图

    以下是Spring Security和OAuth2.0重要组件的关系图:

  • SecurityBuilder:负责集成和配置安全组件,子类包括HttpSecurity
  • AuthenticationManager:由ProviderManager实现,负责用户认证。
  • AuthenticationProvider:实现认证逻辑,子类包括DaoAuthenticationProvider
  • UserDetailsService:接口,由实现类如JohnsonUserDetailsService实现。
  • SecurityMetadataSource:提供安全元数据,子类包括FilterInvocationSecurityMetadataSource
  • AccessDecisionManager:处理权限决策,子类包括AffirmativeBased
  • AccessDeniedHandler:处理权限不足的情况。
  • OAuth2.0处理类:默认实现类OAuth2AuthenticationFilter,负责OAuth认证流程。
  • 6. 配置示例代码

    以下是一些常见的配置示例,供参考:

    6.1 OAuth2.0配置

    @Configurationpublic class OAuth2Config extends WebSecurityConfigurerAdapter {    @Override    protected void configure(HttpSecurity http) throws Exception {        http            .csrf().disable()            .oauth2cq().some CLIENT_ID, CLIENT_SECRET            .withAuthorizationServer()              .tokenGenerator()              .useStateless()              .and()            .withOAuth2اذاً{                @Override                protected OAuth2AuthenticationFilter oauth2AuthenticationFilter() {                    return new OAuth2AuthenticationFilter(oauth2Properties());                }            }}
    @Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {    auth        .inMemoryAuthentication()        .withUser("admin")        .password("password")        .roles("ADMIN")        .and()        .userDetailsService(userDetailsService)        .passwordEncoder(new BCryptPasswordEncoder());}

    6.3 个性化.accessControl

    @Overrideprotected void configure(HttpSecurity http) throws Exception {    http        .authorizeRequests()        .antMatchers("/admin/**")            .hasRole("ADMIN")        .antMatchers("/user/**")            .hasRole("USER")        .and()        .logout()            .logoutUrl("/退出登录")            .deleteCookies()            .logoutSuccessUrl("/")            .and()        .exceptionHandling()            .accessDeniedHandler(new MyAccessDeniedHandler());}

    通过以上配置示例,可以清晰地看到Spring Security和OAuth2.0在实际应用中的灵活配置方式。

    结语

    理解Spring Security的核心工作流程和配置方式,是掌握OAuth2.0安全认证的关键。在实际开发中,建议按照以上结构渐进式进行配置和调试,逐步扩展功能,确保每一步配置都能符合预期行为。同时,熟悉各组件的关系和工作流程,有助于事半功倍、减少调试时间。在实际项目中,可以根据具体需要调整配置策略,优化安全架构,确保系统的完整性和稳定性。

    转载地址:http://zutyk.baihongyu.com/

    你可能感兴趣的文章
    MySQL 的全局锁、表锁和行锁
    查看>>
    mysql 的存储引擎介绍
    查看>>
    MySQL 的存储引擎有哪些?为什么常用InnoDB?
    查看>>
    Mysql 知识回顾总结-索引
    查看>>
    Mysql 笔记
    查看>>
    MySQL 精选 60 道面试题(含答案)
    查看>>
    mysql 索引
    查看>>
    MySQL 索引失效的 15 种场景!
    查看>>
    MySQL 索引深入解析及优化策略
    查看>>
    MySQL 索引的面试题总结
    查看>>
    mysql 索引类型以及创建
    查看>>
    MySQL 索引连环问题,你能答对几个?
    查看>>
    Mysql 索引问题集锦
    查看>>
    Mysql 纵表转换为横表
    查看>>
    mysql 编译安装 window篇
    查看>>
    mysql 网络目录_联机目录数据库
    查看>>
    MySQL 聚簇索引&&二级索引&&辅助索引
    查看>>
    Mysql 脏页 脏读 脏数据
    查看>>
    mysql 自增id和UUID做主键性能分析,及最优方案
    查看>>
    Mysql 自定义函数
    查看>>