为什么在授权用户时会出现此错误。一切按照指示进行。
它不适用于HTTPS。在HTTP中,一切正常。
除登录表单外,其他所有东西都可以正常工作。
@EnableWebSecurity 公共类ConfigSecurity扩展了WebSecurityConfigurerAdapter {
@Autowired private UserDetailsService userDetailsService;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
//auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
auth.userDetailsService(userDetailsService).passwordEncoder(NoOpPasswordEncoder.getInstance());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/accaunt/company/**").hasRole("COMPANY")
.antMatchers("/accaunt/resume/**").hasRole("WORKER")
.antMatchers("/accaunt/**").authenticated()
.anyRequest().permitAll()
.and()
/*
* установка второго параметра (alwaysUse) в false
* говорит Spring Security что в случае успешной
* авторизации можно перенаправить пользователя на
* ту страничку, с которой он пришел на страницу аутентификации.
*/
.formLogin()
.defaultSuccessUrl("/accaunt/main", true)
.loginPage("/login")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/login")
.permitAll()
.and()
.csrf().disable()
.requiresChannel() //config request to use the mapping to a required channel
.anyRequest().requiresSecure();
//maps the port 8080(http) to 8443(https)
http.portMapper().http(8080).mapsTo(8181);
}
}
答案 0 :(得分:0)
在我的头顶上
HttpServletRequest.getScheme
设置为返回正确的值您可以在过滤器链的早期插入过滤器,以在请求进入时专门检查HttpServletRequest.getScheme
的值。这是Spring Security进行评估的方式。
如果Web容器(tomcat / jetty)未在HttpServletRequest上正确设置方案,则是容器配置问题。
我为您创建了一些示例供您试用 我希望您特别注意在您的情况下可能发生的test
git clone https://github.com/fhanik/spring-security-community.git
cd spring-security-community
./gradlew :spring-security-community-samples-requires-secure-with-redirect:bootRun
此示例中的测试显示了一个有效的示例,并省略了对Web服务器的依赖
有效的配置可能类似于:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
//application security
.authorizeRequests()
.mvcMatchers("/non-secure/**").permitAll()
.anyRequest().hasRole("USER")
.and()
.formLogin()
.and()
.requiresChannel().anyRequest().requiresSecure()
.and()
.portMapper().http(8080).mapsTo(8081)
;
// @formatter:on
}
}
我还创建了integration tests来验证此配置。