当调用根控制器(“ /”)时,我想检查用户是否已通过身份验证。如果他没有通过身份验证,我想显示主页,而如果他是身份,我想显示仪表盘,如下所示:
@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
答案 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";
}