我正在使用命名空间配置的 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/