当前位置: 首页 > 知识库问答 >
问题:

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

程沛
2023-03-14

我有一个简单的Spring Boot web应用程序,由2个页面组成:

  • 主页(可自由访问),网址为https://example.com/
  • 在urlhttps://example.com/secure/page.html
  • 上的安全页(需要登录才能访问)

在主页中,我打印访问用户的名字(如果他/她已经通过身份验证的话),或者显示该页面被匿名用户访问的句子。

这里是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("/");
}

如果用户已经通过身份验证,问题是主页显示他是匿名的,因为主体总是null

但是,如果用户回到家里时进入安全页面(Keycloak允许他进入,因为他已经通过了身份验证),页面就会包含--正确地--他的名字。

共有1个答案

花飞扬
2023-03-14

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

艺术就是正确地去做:

    null

所以在这种情况下:

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

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

  • 此处(口头):https://stackoverflow.com/a/26117007/592355
  • 和这里(代码):https://stackoverflow.com/a/57054816/592355

...如果使用Spring Security(JSP)Taglibsisanonymouth()很方便,否则(默认情况下)只需检查hasrole('role_anonymouth')(Ref)

 类似资料:
  • 我的代码在这里:代码重新发布是因为我想问一个更直接的问题。如何在未经身份验证的用户和经过身份验证的用户之间切换?我的未经验证的文件似乎已缓存,我使用了以下方法: 在我剩下的api代码之前,它仍然不能工作。谢谢你的帮助 注意:我知道它不起作用,因为我在切换配置/凭据提供程序后立即使用lambda进行调用,并且只有授权用户才能调用此方法。 编辑@behrooziAWS答案: API代码: 完整错误:B

  • 应如何管理它们? 一些更具体的问题: 根据定义,本机应用程序(实际上是公共客户端)不能安全地存储其凭据(client_id+secret)。是未注册的客户吗?如果我不能使用秘密来验证/验证它,我还应该做什么? 客户端注册≠endpoint注册:第一个是关于注册客户端凭据();第二个关于注册客户端重定向endpoint。重定向endpoint注册是否足以授予客户端的真实性? 客户端凭据授予是否使用相

  • 在我的REST应用程序中,我使用了基本身份验证(发送用户密码并在每次请求时登录)。对于某些需要,我使用以下方法获得登录用户: 但是后来我实现了Spring-Security-Oaut2,我使用访问令牌代替密码和登录。现在. getMain()方法返回“匿名用户”。所以我的问题:有没有办法像上面在sping-security-oauth中那样以某种方式获取登录用户? 编辑:我发现我的安全性“拦截ur

  • 我正在研究使用JWT身份验证的Spring Security实现。我不确定如何检查用户角色并在方法级别获得经过身份验证的用户。我在网上看到这个例子: 我需要从JWT令牌中提取用户类型吗?还有其他方法可以实现吗?在我看来,仅使用是不完整的。 看起来这段代码是用来获得用户如果使用会话类型,我得到NPE。你知道对于JWT我如何才能成为用户吗? Github完整来源:https://Github.com/

  • 我正在尝试将AWS Cognito(用户池)和AWS DynamoDB用于我的移动应用程序。 我做了以下工作: 在AWS Cognito上创建用户池。 在AWS Cognito上创建身份池,并将用户池ID、应用客户端ID设置为身份验证提供商上的Cognito。 在AWS DynamoDB上创建SampleTable. 设置权限验证角色以访问AWS IAM上的SampleTable。 我创建了以下代

  • 当用户启动应用程序时,他们是一个未经身份验证的用户,并且他们将从iOS应用程序中的DeveloperAuthenticatedIdentityProvider类获得。我可以在cognito控制台中看到。但是,当他们登录时,我调用了我的nodejs后端,其登录映射为: 并使用以下后端代码: