问题描述
我有一个由 Spring Security 和表单登录保护的基本 Spring Boot 应用程序。当我调用需要身份验证的站点时,会出现登录表单,这很好。但是在我登录后,似乎是随机发生了以下事情之一:
即使登录成功并且网站出现,如果我重复请求,登录表单也会出现(就像我已注销一样)。
更奇怪的是,我的应用程序被多次部署,而这只发生在生产部署中,唯一的区别是数据库有更多的条目。
谁能解释为什么会发生这种情况?是时间问题吗?
我的安全配置:
@Configuration
public class LoginSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.csrf().disable();
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/webjars/**");
web.ignoring().antMatchers("/js/**");
web.ignoring().antMatchers("/css/**");
web.ignoring().antMatchers("/images/**");
web.ignoring().antMatchers("/public/**");
}
}
@RequestMapping(value = "/site",method = RequestMethod.GET)
public String site() {
return "site";
}
文件 site.html 包含一些 JavaScript、JQuery、Bootstrap 和一些数据:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head lang="en">
<Meta charset="utf-8"/>
<Meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"/>
<link rel="stylesheet" th:href="@{/webjars/bootstrap/4.6.0/css/bootstrap.min.css}" />
<script th:src="@{/webjars/jquery/jquery.min.js}"></script>
<script th:src="@{/webjars/popper.js/umd/popper.min.js}"></script>
<script th:src="@{/webjars/bootstrap/js/bootstrap.min.js}"></script>
</head>
<body>
...
解决方法
问题在于,出于性能原因,应用程序方式部署到 Heroku 上的多个 dyno(容器),因此即使我在一个 dyno 上成功登录,如果我的下一个请求被委托给另一个 dyno,它也没有正确的会话,所以它让我退出并给了我一个新的会话。