【问题标题】:Spring Boot Too Many RedirectsSpring Boot 重定向过多
【发布时间】:2016-09-03 19:32:09
【问题描述】:

我正在使用 Thymeleaf 和 Spring Boot 开发一个简单的登录表单。当我尝试在 Chrome 中点击以下 URL:“http://localhost:8080/login”时,我收到一条错误消息“ERR_TOO_MANY_REDIRECTS”。我已尝试清除浏览器中的缓存和 cookie,但仍然出现相同的错误。

我尝试通过将以下属性放入我的 application.properties 来禁用默认安全登录屏幕:security.basic.enabled=false

并将以下配置添加到我的 SecurityConfig 中,以便除“/login”和“/resources”之外的任何 URL 都可以通过身份验证:

@Configuration 
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired 
    private UserRepository userRepository;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
        .authorizeRequests()
            .antMatchers("/resources/**").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .permitAll();
    }

我的 LoginController 很简单:

@Controller
public class LoginController {

        @RequestMapping(value="/login", method=RequestMethod.GET)
        public String loadForm(Model model) {
            model.addAttribute("user", new User());
            return "redirect:/login";
        }

有人知道为什么会这样吗?

【问题讨论】:

    标签: spring-boot


    【解决方案1】:

    您的控制器捕获并重定向到相同的 url:

    @RequestMapping(value="/login", method=RequestMethod.GET)
        public String loadForm(Model model) {
            model.addAttribute("user", new User());
            return "redirect:/login";
        }
    

    此外,您的 SecurityConfig 定义了这一点:

    @Configuration 
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        protected void configure(HttpSecurity http) throws Exception {
        ...
        .loginPage("/login")
    }
    

    .loginPage() 的 javadoc 是这样说的:

    需要身份验证时重定向到的登录页面

    因此,任何对 /login 的安全请求或直接访问都将:

    • 重定向到 /login 因为你的SecurityConfig 中有.loginPage("/login")
    • 然后您可以使用@RequestMapping(value="/login" 捕获它
    • 然后使用"redirect:/login" 重定向到/login
    • 然后随意重新捕获和重定向。

    【讨论】:

    • 谢谢 Alex,我尝试重定向到另一个 URL,即 /signin,但看起来我遇到了问题!
    • 我改了 return "redirect:/login";只返回“/ login”并将我的视图渲染好。但是,仍然奇怪的是,当我在返回 LoginController 之前添加断点时,我的调试器会触发 3 次。无论如何,感谢您的帮助!
    • 我认为 .loginPage("/login") 之后的 .permitAll() 将使任何用户无需经过身份验证即可查看登录页面?
    • @joel 我已经发布了一个问题并遵循了提到的答案:stackoverflow.com/questions/54565184/…
    • @ASR4 谢谢你的帮助
    猜你喜欢
    • 2021-09-08
    • 1970-01-01
    • 2019-10-22
    • 2015-11-20
    • 2019-02-21
    • 2016-11-06
    • 2015-10-28
    • 2020-07-27
    • 2015-06-29
    相关资源
    最近更新 更多