我正在使用命名空间配置的 spring security 3.2,并且我想将所有调用都设为 https。我知道它会降低大约 1/10 的性能,但我仍然想实现它。我知道你/可能会从 tomcat 本身实现这一点,但我想在 security.xml 中配置它

最佳答案

您可以通过在每个拦截 url 上添加 requires-channel attribute 来配置需要 https。例如:

<http>
  <intercept-url pattern="/secure/**" access="ROLE_ADMIN" requires-channel="https"/>
  <intercept-url pattern="/**" access="ROLE_USER" requires-channel="https"/>
</http>

您可以使用 Spring Security Java Configuration 更简洁地配置它。请注意,我们可以将 channel 配置与角色映射分开。例如:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/secure/**").hasRole("ADMIN")
                .anyRequest.hasRole("USER")
                .and()
            .requiresChannel()
                .anyRequest().requiresSecure();
    }
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
}

从 Spring Security 3.2 开始,您可能还想确保使用 Spring Security 的 header 支持。这在 Spring Security Java 配置中默认启用。在这种特定情况下,该元素可以向响应添加一个名为 Strict-Transport-Security 的 header ,以确保浏览器将来甚至不会发出 HTTP 请求。例如:
<headers>
  <hsts/>
</headers>

您将希望在 the Headers section of the reference 中阅读更多相关信息。

关于https - 在 Spring Security 3.2 中发出每个请求 https,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21538288/

10-13 09:47