成功登录后 Spring Boot Security 重定向 - 未定义

Posted

技术标签:

【中文标题】成功登录后 Spring Boot Security 重定向 - 未定义【英文标题】:Spring Boot Security redirect after successful login - undefined 【发布时间】:2016-12-22 01:45:13 【问题描述】:

我已关注spring boot security tutorial,但最终结果存在一个问题,即成功登录后浏览器重定向到/undefined

我什至克隆了教程中引用的代码,以为我输入了错误,或者忘记添加组件或其他东西。不,同样的问题。

在 *** 上搜索发现需要在 WebSecurityConfigurerAdapterconfigure 方法中定义默认成功 URL,如下所示:

.defaultSuccessUrl("/")

但还是不行。访问受保护的资源会导致登录页面,成功登录后,我不会被重定向到受保护的资源。我进入“/未定义”页面。但是,强制成功有效:

.defaultSuccessUrl("/", true)

...但这不是我需要的,因为在成功登录后,用户应该被重定向到(最初)请求的安全资源。


这是项目的相关部分:

WebSecurityConfig:

package ro.rinea.andrei.Security;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 
    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
        auth.inMemoryAuthentication()
            .withUser("user").password("password").roles("USER");
    

控制器:

package ro.rinea.andrei.Controllers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class WebController 

    @RequestMapping("/")
    public String index() 
        return "index";
    

    @RequestMapping("/salut")
    public String salut() 
        return "salut";
    

    @RequestMapping("/login")
    public String login() 
        return "login";
    

indexloginsalut 定义了视图(如果需要我会添加它们的内容)

以及 build.gradle 文件:

buildscript 
    ext 
        springBootVersion = '1.4.0.RELEASE'
    
    repositories 
        mavenCentral()
    
    dependencies 
        classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion")
    


apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'spring-boot'

jar 
    baseName = 'tstBut'
    version = '0.0.1-SNAPSHOT'

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories 
    mavenCentral()



dependencies 
    compile('org.springframework.boot:spring-boot-devtools')
    compile('org.springframework.boot:spring-boot-starter-jdbc')
    compile('org.springframework.boot:spring-boot-starter-jersey')
    compile('org.springframework.boot:spring-boot-starter-mobile')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    compile('org.springframework.boot:spring-boot-starter-validation')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-web-services')
    compile('org.springframework.boot:spring-boot-starter-security')
    runtime('org.postgresql:postgresql')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('org.springframework.restdocs:spring-restdocs-mockmvc')

【问题讨论】:

您找到问题的答案了吗?如果是,请接受对您有帮助的答案,以便其他人(例如我)可以找到解决方案。 【参考方案1】:

你可以像这样添加一个successHandler来重定向:

private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
   ...
   .formLogin()
   .loginPage("/login")
   .successHandler(new AuthenticationSuccessHandler() 
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
            Authentication authentication) throws IOException, ServletException 
        redirectStrategy.sendRedirect(request, response, "/");
    
)

【讨论】:

【参考方案2】:

我遇到了同样的问题,这是我使用的解决方法。 首先有一个不受保护的根“/”的映射

@RequestMapping(value =  "/" , method = RequestMethod.GET)
public ModelAndView projectBase() 
    return new ModelAndView("redirect:/home");

让它重定向到您希望用户最初去的地方,例如回家

@RequestMapping(value =  "/home" , method = RequestMethod.GET)
public ModelAndView getHome() 
    ModelAndView model = new ModelAndView("account/home");
    model.addObject("user", userFacade.getJsonForUser(userFacade.getUserForClient()));
    return model;

确保根 url 在您的安全配置中打开,例如...

 http.
    authorizeRequests()
    .antMatchers("/").permitAll()

现在会发生什么,它将访问根 /,并重定向到受限制的主页,并将它们发送到带有主页返回 url 的登录页面。然后,当他们第一次登录时,它会正确地写为 /home

出于某种原因,spring security 不尊重默认的成功 url,这可能是您的 Web 服务器的配置问题导致的。在我的本地机器上我没有这个问题,但在其他一些机器上我有。解决方法在这两个地方都有效,因为您总是以 returnUrl 结束。

【讨论】:

以上是关于成功登录后 Spring Boot Security 重定向 - 未定义的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot 中成功 Oauth2 登录后 Cookie 身份验证而不是 JWT Bearer Token

Spring boot OAuth成功登录侦听器未触发

使用Spring Boot Starter安全性中的Custom登录页面成功登录,没有进入下一页

Spring Boot + Spring Security Restful 登录

Spring boot Security 登陆安全配置

spring boot 项目登录模块之身份验证