HttpSecurity 详解

Scroll Down

HttpSecurity 详解

1.概要

很多朋友在使用,SpringSecurity做认证授权的时候,对请求拦截,及指定身份认证配置不太了解,这是因为对HttpSecurity不太熟悉,本文对HttpSecurity常用方法进行详解

2.方法列表

2.1formLogin()

  • 说明:指定支持 基于表单 的身份验证。如果没有指定{@link FormLoginConfigurer#loginPage()},将生成一个默认的登录页面。

  • 例子

 http.authorizeRequests()
     .antMatchers("/**").hasRole("USER")
     .and().formLogin()
     .usernameParameter("username")
     .passwordParameter("password")
     .loginPage("/authentication/login")
     .failureUrl("/authentication/login?failed")
     .loginProcessingUrl("/authentication/login/process");

2.2 openidLogin()

  • 说明:配置基于 OpenID 的认证
  • 示例:启用 OpenID 认证
http.authorizeRequests().antMatchers("/**").hasRole("USER").and().openidLogin().permitAll();

2.3 headers()

  • 说明:向响应添加 请求安全头 。当使用 {@link WebSecurityConfigurerAdapter} 的默认构造函数时,它会被默认激活。
  • 示例
// 只调用 `{@link HttpSecurity#headers()}` ,其实相当于调用了以下的所有方法
http.headers().contentTypeOptions()
    .and().xssProtection()
    .and().cacheControl()
    .and().httpStrictTransportSecurity()
    .and().frameOptions()
    .and()
    //      ...
    ;

//可以禁用 headers()
http.headers().disable();

//使用部分请求头,前提你需要调用 {@link HeadersConfigurer#defaultsDisabled()} 先关闭所有,然后打开你想要的请求头

http.headers().defaultsDisabled().cacheControl()
    .and().frameOptions()
    .and()
    //      ...
    ;

//可以选择默认值,而关闭某些特定的请求头

http.headers()
    .frameOptions()
    .disable()
    .and()
    //      ...
    ;

2.4 cors()

  • 说明:添加要使用的 {@link CorsFilter} 。如果提供了一个名为 corsFilter 的bean,则使用 {@link corsFilter} 添加该Filter。

2.5 sessionManagement()

  • 说明:允许配置 Session 会话管理
http.authorizeRequests().anyRequest().hasRole("USER")
    .and().formLogin().permitAll()
    .and().sessionManagement().maximumSessions(1).expiredUrl("/login?expired");
///强制一次只对用户的单个实例进行身份验证。如果用户使用用户名 user 进行身份验证而没有注销,并且尝试再次使用 user 进行身份验证,第一个会话将被强制终止并发送到 /login?expired URL。当使用 {@link SessionManagementConfigurer#maximumSessions()} 时,不要忘记为应用程序配置 {@link HttpSessionEventPublisher} ,以确保过期的会话被清除。

2.6 portMapper()

  • 说明:允许配置 {@link HttpSecurity#getSharedObject()} 中可用的 {@link PortMapper} 端口映射。
  • 提供的 {@link SecurityConfigurer} 对象在从HTTP重定向到HTTPS,或从HTTPS重定向到HTTP时,使用这个配置作为默认的 {@link PortMapper}。默认情况下,Spring Security使用 {@link PortMapperImpl} 将HTTP端口8080映射到HTTPS端口8443,将HTTP端口80映射到HTTPS端口443。
http.portMapper().http(9090).mapsTo(9443).http(80).mapsTo(443);

2.7 jee()

  • 说明:配置 基于容器 的预认证。在本例中,身份验证由Servlet容器管理。
  • 示例:这个示例将使用 {@link HttpServletRequest} 上找到的用户,如果用户是角色 ROLE_USERROLE_ADMIN ,则将其添加到生成的 {@link Authentication} 中。
 http.authorizeRequests()
     .antMatchers("/**").hasRole("USER")
     .and()
     .jee().mappableRoles("ROLE_USER", "ROLE_ADMIN");

2.8 x509()

  • 说明:配置基于 X509 的预认证。
  • 示例:这个示例将尝试从 X509 证书中提取用户名。需要配置Servlet容器来请求客户端证书
http.authorizeRequests()
    .antMatchers("/**").hasRole("USER")
    .and()
    .x509();

2.9 rememberMe()

  • 说明:配置 Remember Me 认证。
  • 示例:在进行身份验证时,如果名为 remember-me 的HTTP参数存在,那么即使在他们的 {@link javax.servlet.http.HttpSession} 过期失效之后,用户也会被记住。

2.10 authorizeRequests()

  • 说明:配置基于 {@link HttpServletRequest} 使用限制访问

2.11 requestCache()

  • 说明:允许配置 请求缓存 。例如,一个受保护的页面 /protected 可能会在身份验证之前被请求。应用程序将用户重定向到登录页面,身份验证之后,Spring Security将用户重定向到最初请求的受保护页面 /protected 。当使用 {@link WebSecurityConfigurerAdapter} 时,会被默认激活。

2.12 exceptionHandling()

  • 说明:允许配置 异常处理 。当使用 {@link WebSecurityConfigurerAdapter} 时,会被默认激活。

2.13 securityContext()

  • 说明:在 {@link HttpServletRequest} 之间的 {@link SecurityContext} 上建立 {@link SecurityContextHolder} 的管理。当使用 {@link WebSecurityConfigurerAdapter} 时,会被默认激活。

2.14 servletApi()

  • 说明:将 {@link HttpServletRequest} 方法与 {@link SecurityContext} 上的值集成起来。当使用 {@link WebSecurityConfigurerAdapter} 时,会被默认激活。

2.15 csrf()

  • 说明:添加 CSRF 支持
  • 当使用 {@link WebSecurityConfigurerAdapter} 时,会被默认激活。你可以禁用(disable)它

2.16 logout()

  • 说明:提供 注销 的支持。当使用 {@link WebSecurityConfigurerAdapter} 时,会被默认激活。默认情况下,访问URL /logout 将使HTTP会话失效,清除配置的所有 {@link HttpSecurity#rememberMe()} 身份验证,清除 {@link SecurityContextHolder} ,然后重定向到 /login?success,从而使用户退出。

  • 示例:下面的配置,当 /custom-logout 接口被调用时,会走注销流程。注销将删除名为 remove 的cookie,清除 SecurityContexHolder,但是不会使 HttpSession 失效,在完成上面动作之后重定向到 /logout-success。

    http.authorizeRequests().antMatchers("/**").hasRole("USER")
                    .and().formLogin()
                    .and()
                    .logout().deleteCookies("remove").invalidateHttpSession(false)
                    .logoutUrl("/custom-logout")
                    .logoutSuccessUrl("/logout-success");
    

2.17 anonymous()

  • 说明:允许配置 匿名用户 的表示方式。当使用 {@link WebSecurityConfigurerAdapter} 时,会被默认激活。默认情况下,匿名用户将用 {@link org.springframework.security.authentication.AnonymousAuthenticationToken} ,包含角色 ROLE_ANONYMOUS。
  • 示例1:下面的配置演示了如何指定匿名用户应该包含角色 ROLE_ANON。
http.authorizeRequests()
    .antMatchers("/**").hasRole("USER")
    .and().formLogin()
    .and()
    .anonymous().authorities("ROLE_ANON");
  • 示例2:下面演示了如何将匿名用户表示为空。注意,假设启用了匿名身份验证可能会导致代码中出现空指针异常。
http.authorizeRequests()
    .antMatchers("/**").hasRole("USER")
    .and().formLogin()
    .and()
    .anonymous().disable();

2.18 requiresChannel()

  • 说明:配置 通道安全(HTTPS访问)。为了使该配置有用,至少必须提供一个到所需通道的映射。
  • 示例:下面的例子演示了如何为每个请求要求HTTPS。不建议只支持某些请求需要HTTPS,因为允许HTTP的应用程序会引入许多安全漏洞。
http.authorizeRequests()
                .antMatchers("/**").hasRole("USER")
                .and().formLogin()
                .and().requiresChannel().anyRequest().requiresSecure();

2.19 httpBasic()

  • 说明:配置 HTTP基本认证
  • 示例:下面的示例演示如何为应用程序配置HTTP基本身份验证。默认的领域是 Spring Security Application ,但是可以使用 {@link HttpBasicConfigurer#realmName()} 自定义。
http.authorizeRequests()
    .antMatchers("/**").hasRole("USER")
    .and()
    .httpBasic();

2.20 requestMatchers()

说明:如果只需要一个 {@link RequestMatcher},可以考虑使用 {@link #mvcMatcher()} 、{@link #antMatcher()}、 {@link #regexMatcher()}、或{@link #requestMatcher()}。调用 {@link #requestMatchers()} 不会覆盖之前对 {@link #mvcMatcher()}、{@link #requestMatchers()}、{@link #antMatcher()}、{@link #regexMatcher()} 和 {@link #requestMatcher()} 的调用。

//下面配置了以 /api/ 和 /oauth/ 开头的URL,无需认证
http
    .requestMatchers()
    .antMatchers("/api/**", "/oauth/**")
    .and()
    .authorizeRequests()
    .antMatchers("/**").hasRole("USER")
    .and()
    .httpBasic();

2.21 addFilterAt()

  • 说明:在指定的过滤器位置添加过滤器。

2.22 requestMatcher()

  • 说明:允许将 {@link HttpSecurity} 配置为只在匹配所提供的 {@link RequestMatcher} 时被调用。如果需要更高级的配置,可以考虑使用{@link #requestMatchers()}

2.23 antMatcher()

  • 说明:允许将 {@link HttpSecurity} 配置为只在匹配所提供的 ant 模式时被调用。如果需要更高级的配置,可以考虑使用 {@link #requestMatchers()}{@link #requestMatcher()}

2.24 mvcMatcher()

  • 说明:允许将 {@link HttpSecurity} 配置为只在匹配所提供的 Spring MVC 模式时被调用。如果需要更高级的配置,可以考虑使用 {@link #requestMatchers()} 或 {@link #requestMatcher(requestMatcher)} 。

2.25 regexMatcher()

  • 说明:允许将 {@link HttpSecurity} 配置为只在匹配所提供的 正则表达式 模式时被调用。如果需要更高级的配置,可以考虑使用 {@link #requestMatchers()}{@link #requestMatcher()}

2.26 getOrApply()

  • 说明:如果 {@link SecurityConfigurer} 已经被指定获取原始的,否则应用新的 {@link SecurityConfigurerAdapter} 配置。

2.27 setSharedObject()

  • 说明:设置分布式对象SharedObject
  • SharedObject是Spring Security提供的一个非常好用的功能,如果你在不同的地方需要对一个对象重复使用就可以将它注册为SharedObject,甚至直接注入Spring IoC像开头那样获取就可以了。这个特性能够简化配置,提高代码的可读性,也为Spring Security的DSL特性打下了基础

2.28 beforeConfigure()

  • 说明:本身是空方法,可以注入配置 在 doBuild 方法执行时调用

2.29 performBuild()

  • 说明:实现的父类 AbstractConfiguredSecurityBuilder 的抽象接口,目的是创建SecurityFilterChain实例

2.30 authenticationProvider()

  • 说明:可设置认证流程

2.31 userDetailsService()

  • 说明:可设置用户 服务

2.32 getAuthenticationRegistry()

  • 说明:获取身份验证注册表

2.33 addFilterAfter()

  • 说明:在某个过滤器之后添加一个新的过滤器

2.34 addFilterBefore()

  • 说明:在某个过滤器之前添加一个新的过滤器

2.35 addFilter()

  • 说明:添加锅炉其