博客
关于我
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/

    你可能感兴趣的文章
    mt_rand
    查看>>
    mysql -存储过程
    查看>>
    mysql /*! 50100 ... */ 条件编译
    查看>>
    mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
    查看>>
    mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
    查看>>
    mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
    查看>>
    mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
    查看>>
    MySQL 8.0 恢复孤立文件每表ibd文件
    查看>>
    MySQL 8.0开始Group by不再排序
    查看>>
    mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
    查看>>
    multi swiper bug solution
    查看>>
    MySQL Binlog 日志监听与 Spring 集成实战
    查看>>
    MySQL binlog三种模式
    查看>>
    multi-angle cosine and sines
    查看>>
    Mysql Can't connect to MySQL server
    查看>>
    mysql case when 乱码_Mysql CASE WHEN 用法
    查看>>
    Multicast1
    查看>>
    mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
    查看>>
    MySQL Cluster 7.0.36 发布
    查看>>
    Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
    查看>>