Sping Boot 3 + OAuth2 + Keycloak无效会话ID

qnakjoqk  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(128)

我正在使用OAuth2和Sping Boot 3.1.5实现Keycloak 22.0.5。我想使用基本身份验证。在keycloak方面,我已经为用户创建了一个Realm,client,user和相应的角色,并且适用于我正在ping的端点。我经常遇到这个错误的问题:

DEBUG o.s.s.w.s.SessionManagementFilter.doFilter - Request requested invalid session id ***SESSION_ID_TOKEN***

字符串
SESSION_ID_TOKEN在我尝试发送到端点的每个请求的日志中总是相同的,并且我总是得到401 Unauthorized。
这是我当前的实现:

  • 应用程序.yml:*
origins: http://localhost:9999
issuer: **KEYCLOAK-URL**

com:
  c4-soft:
    springaddons:
      oidc:
        ops:
          - iss: ${issuer}
            username-claim: preferred_username
            authorities:
              - path: $.realm_access.roles
                prefix: ROLE_
              - path: $.resource_access.*.roles
        resourceserver:
          cors:
            - path: /**
              allowed-origin-patterns: ${origins}
          permit-all:
            - "/example"

  • WebSecurityConfig:*
@Configuration
@EnableMethodSecurity
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf(AbstractHttpConfigurer::disable);
        http.authorizeHttpRequests(accessManagement -> accessManagement
                .anyRequest().authenticated());
        http.sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
        http.exceptionHandling(eh -> eh.authenticationEntryPoint((request, response, authException) -> {
            response.addHeader(HttpHeaders.WWW_AUTHENTICATE, "Bearer realm=\"Restricted Content\"");
            response.sendError(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.getReasonPhrase());
        }));
        return http.build();
    }
}


我在Keycloak -> Realm settings -> Sessions中的设置是:x1c 0d1xx 1c 1d 1x
有人知道问题出在哪吗?

eqqqjvef

eqqqjvef1#

你的问题中有很多矛盾之处:

  • Basic身份验证设置Keycloak的意义是什么?Keycloak是一个OIDC授权服务器,它旨在用于OAuth2安全流
  • 你使用spring-addons-starter-oidc属性,所以我想你在classpath上有the jar(不能确定,因为你既没有提供pom也没有提供gradle构建文件),但是你定义了自己的SecurityFilterChain,而没有securityMatcher =>这个过滤器链旨在处理所有请求。如果它配置的resourceServerSecurityFilterChain从未使用过,那么使用spring-addons有什么意义呢?
  • 您定义的SecurityFilterChain是无状态的,但是既没有为Basic也没有为Bearer授权进行配置。您希望它如何准确地工作?

我的猜测是因为你没有在你定义的SecurityFilterChain中设置BasicBearer授权(并设计为拦截所有请求),Spring Security试图从会话构建安全上下文,但是因为你也定义了sessionCreationPolicy(SessionCreationPolicy.STATELESS),它找不到有效的会话令牌。但是没有reproducer项目,很难说。

相关问题