【发布时间】:2021-08-13 13:22:02
【问题描述】:
我有一个简单的 Spring Boot Web 应用程序,由 2 个页面组成:
- 网址为
https://example.com/的主页(可免费访问) - 网址为
https://example.com/secure/page.html的安全页面(需要登录才能访问)
在主页中,我正在打印访问用户的名字(如果他/她已经通过身份验证)或说明该页面由匿名用户访问的句子。
就身份验证而言,我正在使用 Keycloak。
这里是 Spring Security 配置:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/secure/**")
.authenticated()
.and()
.csrf().requireCsrfProtectionMatcher(keycloakCsrfRequestMatcher())
.and()
.sessionManagement()
.sessionAuthenticationStrategy(sessionAuthenticationStrategy())
.and()
.addFilterBefore(keycloakPreAuthActionsFilter(), LogoutFilter.class)
.addFilterBefore(keycloakAuthenticationProcessingFilter(), BasicAuthenticationFilter.class)
.addFilterBefore(keycloakAuthenticatedActionsFilter(), BasicAuthenticationFilter.class)
.addFilterAfter(keycloakSecurityContextRequestFilter(), SecurityContextHolderAwareRequestFilter.class)
.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint())
.and()
.logout()
.addLogoutHandler(keycloakLogoutHandler())
.logoutUrl("/sso/logout").permitAll()
.logoutSuccessUrl("/");
}
如果用户已经通过身份验证,问题是主页显示他是匿名的,因为Principal 始终是null。
但是,如果用户在返回主页时进入安全页面(并且 Keycloak 允许他进入,因为他已经过身份验证),则该页面包含 - 正确 - 他的名字。
我的配置哪里错了?
似乎 Spring Security 不会检查非安全页面上的身份验证。有没有办法告诉 Spring Security 检查每个页面(安全和非安全)?
提前感谢您的支持。
【问题讨论】:
标签: spring-boot authentication spring-security keycloak