我有一个简单的spring boot web应用程序,包含两个页面:
url处的主页(可自由访问) https://example.com/
url处的安全页面(需要登录才能访问) https://example.com/secure/page.html
在主页中,我打印访问用户的名字(如果他/她已经通过身份验证)或一句话,表示该页面被匿名用户访问。
就身份验证而言,我使用的是keydove。
这里是spring安全配置:
@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
.
但是,如果用户在返回主页时进入安全页面(KeyClope允许他进入,因为他已经通过了身份验证),页面将正确地包含他的名字。
我的配置哪里错了?
SpringSecurity似乎没有检查非安全页面上的身份验证。有没有办法告诉spring security检查每个页面(安全和非安全页面)?
提前感谢您的支持。
1条答案
按热度按时间djmepvbi1#
解决这个问题的办法是增加
/**
到安全上下文/处理(使用permitAll()
).艺术在于正确地做:
Spring 安全中的多个蚂蚁匹配者(第一个蚂蚁匹配者获胜!!,https://www.google.com/search?q=spring+安全+许可(高+不+工作)
http://blog.florian-hopf.de/2017/08/spring-security.html
因此,在这种情况下:
…应填写(匿名)
Principal
也在“许可区域”(即。/**
(!) ...然后离开secure/**
限制!;)。对于核心/标题问题(一旦校长被填补),我认为答案已经给出:
在此(口头):https://stackoverflow.com/a/26117007/592355
在这里(带代码):https://stackoverflow.com/a/57054816/592355
…如果您使用Spring Security (jsp)标记库
isAnonymous()
很方便,否则(默认情况下)只需检查hasRole('ROLE_ANONYMOUS')
(参考)