在Spring中重定向已登录的用户

在Spring中重定向已登录的用户,spring,spring-security,spring-boot,Spring,Spring Security,Spring Boot,我使用此Java配置是为了使用Spring Boot+Spring Security管理http路由: @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/").permitAll() .antMatchers("/home").permitAl

我使用此Java配置是为了使用Spring Boot+Spring Security管理http路由:

@Override   
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/").permitAll()
            .antMatchers("/home").permitAll()           
            .antMatchers("/public/**").permitAll()
            .antMatchers("/signup").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/landing")
            .permitAll()
        //...
}

现在,我只有一个问题:如何将已登录的用户从/login重定向到/landing页面?我必须在控制器内部或在如上所示的配置类中检查此情况吗?

您可以在/login“端点中处理此情况。类似这样的情况如何:

@RequestMapping("/login")
public String login(Principal principal) {
    if (principal!=null && ((Authentication)principal).isAuthenticated()) {
        return "forward:/landing";
    }
    return "login";
}

或者我想您可以添加一个过滤器(似乎有些过分)。

您可以在/login“端点中处理该问题。像这样的怎么样:

@RequestMapping("/login")
public String login(Principal principal) {
    if (principal!=null && ((Authentication)principal).isAuthenticated()) {
        return "forward:/landing";
    }
    return "login";
}
或者我想你可以添加一个过滤器(看起来有些过分)。

你可以这样做:

@RequestMapping("/login")
public String login() {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    if (auth.getPrincipal() instanceof UserDetails) {
        return "redirect:/landing";
    } else return "login";
}
可以改变这一点:

http
        .authorizeRequests()
            .antMatchers("/").permitAll()
            .antMatchers("/home").permitAll()           
            .antMatchers("/public/**").permitAll()
            .antMatchers("/signup").permitAll()
为此:

http
        .authorizeRequests()
            .antMatchers("/", "/home", "/public/**", "/signup").permitAll()
您可以这样做:

@RequestMapping("/login")
public String login() {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    if (auth.getPrincipal() instanceof UserDetails) {
        return "redirect:/landing";
    } else return "login";
}
可以改变这一点:

http
        .authorizeRequests()
            .antMatchers("/").permitAll()
            .antMatchers("/home").permitAll()           
            .antMatchers("/public/**").permitAll()
            .antMatchers("/signup").permitAll()
为此:

http
        .authorizeRequests()
            .antMatchers("/", "/home", "/public/**", "/signup").permitAll()

你能更详细地描述一下你想要的流程,以及你看到的是什么吗?在我看来,访问“/login”的用户将获得一个表单,如果他提交成功,他将被转发到“/landing”。这不是你想要的。如果这个用户已经登录并进入“/login”,我希望系统将他重定向到“/landing”。你能更详细地描述一下你想要的流程,以及你看到的是什么吗?在我看来,访问“/login”的用户将获得一个表单,如果他提交成功,他将被转发到“/landing”。这不是你想要的。如果这个用户已经登录并进入“/login”,我希望系统在“/landing”上重定向他。