如何在Spring Security中检查用户是否已登录或匿名

时间:2019-07-16 09:05:38

标签: spring-boot spring-security

当调用根控制器(“ /”)时,我想检查用户是否已通过身份验证。如果他没有通过身份验证,我想显示主页,而如果他是身份,我想显示仪表盘,如下所示:

@GetMapping("/")
public String homePage() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

    if(authentication == null) return "home";

    return "dashboard";
}

但是当我运行该程序时,它将尝试显示仪表板,这意味着显然if()条件返回的是false 。但是我知道我绝对没有登录。这为什么不起作用。

此外,我知道我可以像这样重写WebSecurityConfigurerAdapter中的configure(HttpSecurity http)方法:

http.authorizeRequests().antMatchers("/").authenticated();

但是这会将我重定向到/ login页面,对于其他任何请求都可以,但是如果没有会话,我想将其重定向到“首页”页面的(//)都不行

这是Sysout后进行身份验证的值:org.springframework.security.authentication.AnonymousAuthenticationToken@52132976: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS

1 个答案:

答案 0 :(得分:0)

您必须禁用匿名身份验证,请参见HttpSecurity#anonymous

  

以下内容演示了如何将匿名用户表示为null。请注意,这可能会导致假设启用匿名身份验证的代码中的NullPointerException

     
@Configuration
@EnableWebSecurity
public class AnononymousSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/**").hasRole("USER").and().formLogin()
                            .and()
                            // sample anonymous customization
                            .anonymous().disabled();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
              auth.inMemoryAuthentication().withUser("user").password("password").roles("USER");
    }
}

,或者您可以检查类AnonymousAuthenticationToken。您修改的代码:

@GetMapping("/")
public String homePage() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

    if (authentication instanceof AnonymousAuthenticationToken) return "home";

    return "dashboard";
}