博客
关于我
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 insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目...
    查看>>
    mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
    查看>>
    Mysql join原理
    查看>>
    MySQL Join算法与调优白皮书(二)
    查看>>
    Mysql order by与limit混用陷阱
    查看>>
    Mysql order by与limit混用陷阱
    查看>>
    mysql order by多个字段排序
    查看>>
    MySQL Order By实现原理分析和Filesort优化
    查看>>
    mysql problems
    查看>>
    mysql replace first,MySQL中处理各种重复的一些方法
    查看>>
    MySQL replace函数替换字符串语句的用法(mysql字符串替换)
    查看>>
    mysql replace用法
    查看>>
    Mysql Row_Format 参数讲解
    查看>>
    mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
    查看>>
    MySQL Server 5.5安装记录
    查看>>
    mysql server has gone away
    查看>>
    mysql slave 停了_slave 停止。求解决方法
    查看>>
    MySQL SQL 优化指南:主键、ORDER BY、GROUP BY 和 UPDATE 优化详解
    查看>>
    MYSQL sql语句针对数据记录时间范围查询的效率对比
    查看>>
    mysql sum 没返回,如果没有找到任何值,我如何在MySQL中获得SUM函数以返回'0'?
    查看>>