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

Spring boot Spring安全性:如何在公共页面中识别用户已通过身份验证,spring-boot,authentication,spring-security,keycloak,Spring Boot,Authentication,Spring Security,Keycloak,我有一个简单的Spring Boot web应用程序,包含两个页面: urlhttps://example.com/ url处的安全页面(需要登录才能访问)https://example.com/secure/page.html 在主页中,我打印访问用户的名字(如果他/她已经通过身份验证)或一句话,表示该页面被匿名用户访问 就身份验证而言,我使用的是keydove 这里是Spring安全配置: @Override protected void configure(HttpSecurity h

我有一个简单的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("/");
}
如果用户已经过身份验证,问题是主页上说他是匿名的,因为
主体
总是
null

但是,如果用户在返回主页时进入安全页面(KeyClope允许他进入,因为他已经通过了身份验证),页面将正确地包含他的名字

我的配置哪里错了

SpringSecurity似乎没有检查非安全页面上的身份验证。有没有办法告诉Spring Security检查每个页面(安全和非安全页面)


提前感谢您的支持。

此问题的解决方案是将
/**
添加到安全上下文/处理中(使用)

艺术在于正确地做:

  • (第一个蚂蚁匹配者获胜!!,)
因此,在这种情况下:

 http
  .authorizeRequests()
  .antMatchers("/secure/**").authenticated()
  .antMatchers("/**").pernmitAll()
  .and()...
…还应在“允许区域”(即
/**
(!)中填写(匿名)
负责人
,并保留
安全/**
限制!;)


对于核心/标题问题(一旦校长被填补),我认为答案已经给出:

  • 在此(口头):
  • 在这里(带代码):

…如果您使用的是方便的,否则(默认情况下)您只需检查
hasRole('ROLE\u ANONYMOUS')
()

谢谢您的宝贵建议。我实现了建议的解决方案,实际上,主体现在填充了
ROLE\u ANONYMOUS
,并且不再为空。但是,这并不是问题的解决方案,因为如果已登录的用户访问了主页(公共),则在进入安全页面之前,该用户将被视为
匿名用户。从那时起,他就被认出来了。如果存在
.permitAll()
,Spring Security似乎不会检查SSO系统。我还能试什么?非常感谢您的支持。sry,如果我没有弄好,但他“进入主页”时是如何“登录”的??有点像鸡蛋问题!?(我倾向于鸡蛋;)…是的,使用此解决方案,您只能是匿名的或经过身份验证的…而且由于您只需要在安全区域(根据要求)进行身份验证,因此“进入”主页的每个用户都将是匿名的!。。。直到他(访问安全区域并)登录…(然后回到主页,用他的名字欢迎他;)尽管,我是xerx593,化身…我不能期望任何网站在我登录之前知道这一点。。。(使用“cookie”可以实现此功能)…用户已通过身份验证,因为他登录了SSO系统下的另一个应用程序。因此,我希望,当他到达主页时,Spring Security能够立即识别他,而无需进入一个安全页面(在该页面中,一切都按预期进行)。非常感谢你的时间。谢谢,现在对我来说更有意义了!是的,这听起来像:SSO未正确配置/主体将无法填充……->;)