ssl - 错误“ERR_INVALID_REDIRECT”到表单登录
问题描述
为什么授权用户时会出现这个错误。一切都按照指示做了。
它不适用于 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);
}
}
解决方案
在我的头顶上,
- servlet 容器未将请求标记为安全并设置
HttpServletRequest.getScheme
为返回正确的值 - 另一个过滤器正在捕获请求 3.
您可以在过滤器链的早期插入一个过滤器,以便在请求进入时专门查看该HttpServletRequest.getScheme
值。这是 Spring Security 用来进行评估的。
如果 Web 容器(tomcat/jetty)没有在 HttpServletRequest 上正确设置方案,那么这是一个容器配置问题。
我已经创建了一些示例供您使用,我希望您特别注意您的案例中可能发生的测试
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
}
}
我还创建了验证此配置的集成测试。
推荐阅读
- c - 我写了一个函数,它接受一个字符串,并将每个单词的最后一个字符大写,其余的小写。它有什么问题?
- php - 有没有办法在使用 PDO 提交事务之前读取插入的行?
- image-processing - ValueError:无法将输入数组从形状(128,128,1)广播到形状(128,128,3,1)
- json - 如何按负载对 jq 结果进行排序?
- python - 计算列表列表中的子列表数
- python - 从订单簿中获取蜡烛
- javascript - 使用 javascript 在模板中添加 django for 循环
- react-native - React Native onPress 函数不断被调用
- c# - 有没有办法在 C# 中生成对象名称而无需硬编码?
- google-cloud-platform - 具有云功能的 gcp 故障检测器