Spring Security :如何在公共页面中识别用户已通过身份验证

2q5ifsrm  于 2021-10-10  发布在  Java
关注(0)|答案(1)|浏览(401)

我有一个简单的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检查每个页面(安全和非安全页面)?
提前感谢您的支持。

djmepvbi

djmepvbi1#

解决这个问题的办法是增加 /** 到安全上下文/处理(使用 permitAll() ).
艺术在于正确地做:
Spring 安全中的多个蚂蚁匹配者(第一个蚂蚁匹配者获胜!!,https://www.google.com/search?q=spring+安全+许可(高+不+工作)
http://blog.florian-hopf.de/2017/08/spring-security.html
因此,在这种情况下:

http
  .authorizeRequests()
  .antMatchers("/secure/**").authenticated()
  .antMatchers("/**").pernmitAll()
  .and()...

…应填写(匿名) Principal 也在“许可区域”(即。 /** (!) ...然后离开 secure/** 限制!;)。
对于核心/标题问题(一旦校长被填补),我认为答案已经给出:
在此(口头):https://stackoverflow.com/a/26117007/592355
在这里(带代码):https://stackoverflow.com/a/57054816/592355
…如果您使用Spring Security (jsp)标记库 isAnonymous() 很方便,否则(默认情况下)只需检查 hasRole('ROLE_ANONYMOUS') (参考)

相关问题