对于未经身份验证的请求,Keycloak spring boot 返回 403 而不是 401

Posted

技术标签:

【中文标题】对于未经身份验证的请求,Keycloak spring boot 返回 403 而不是 401【英文标题】:Keyclock springboot returns 403 instead of 401 for unauthenticated requests 【发布时间】:2021-11-25 16:25:57 【问题描述】:

在启用策略执行器配置时,对于未经身份验证的请求,Keyclock 返回 403 而不是 401。删除策略执行器配置时,它返回 401。

有了这个配置,我得到一个 403 空响应。

keycloak:
  realm: $KEYCLOAK_REALM
  auth-server-url: $KEYCLOAK_AUTH_SERVER_URL
  ssl-required: external
  resource: $KEYCLOAK_CLIENT_ID
  credentials.secret: $KEYCLOAK_CLIENT_SECRET
  use-resource-role-mappings: true
  cors: true
  public-client: false
  bearer-only: true
  policy-enforcer-config:
    lazy-load-paths: true
    http-method-as-scope: true
    path-cache-config:
      max-entries: 1000
      lifespan: 1000
    paths:
      - name: Insecure Resource
        path: /
        enforcement-mode: DISABLED
      - name: Swagger UI
        path: /swagger-ui/*
        enforcement-mode: DISABLED
      - name: Swagger Resources
        path: /swagger-resources/*
        enforcement-mode: DISABLED
      - name: Swagger api Resources
        path: /api-docs
        enforcement-mode: DISABLED
  securityConstraints:
    - authRoles:
       - '*'
      securityCollections:
        - name: protected
          patterns:
            - '/v1/*'
            - '/intranet/*'

如果我像这样删除策略执行器

keycloak:
  realm: $KEYCLOAK_REALM
  auth-server-url: $KEYCLOAK_AUTH_SERVER_URL
  ssl-required: external
  resource: $KEYCLOAK_CLIENT_ID
  credentials.secret: $KEYCLOAK_CLIENT_SECRET
  use-resource-role-mappings: true
  cors: true
  public-client: false
  bearer-only: true
#  policy-enforcer-config:
#    lazy-load-paths: true
#    http-method-as-scope: true
#    path-cache-config:
#      max-entries: 1000
#      lifespan: 1000
#    paths:
#      - name: Insecure Resource
#        path: /
#        enforcement-mode: DISABLED
#      - name: Swagger UI
#        path: /swagger-ui/*
#        enforcement-mode: DISABLED
#      - name: Swagger Resources
#        path: /swagger-resources/*
#        enforcement-mode: DISABLED
#      - name: Swagger api Resources
#        path: /api-docs
#        enforcement-mode: DISABLED
  securityConstraints:
    - authRoles:
       - '*'
      securityCollections:
        - name: protected
          patterns:
            - '/v1/*'
            - '/intranet/*'

返回 401


    "timestamp": "2021-10-05T11:25:33.116+0000",
    "status": 401,
    "error": "Unauthorized",
    "message": "No message available",
    "path": "/v1/approve-documents"

所有请求都在执行策略,即使它没有经过身份验证。如果令牌无效或丢失,如何返回 401。

完整代码https://github.com/prajintst/keyclock-permissions

【问题讨论】:

你能分享这两种情况的堆栈跟踪吗?为了启用政策执行者,我得到了There was an unexpected error (type=Internal Server Error, status=500). Failed to obtain policy enforcer 策略执行应该发生在所有请求上,无论它们是经过身份验证还是未经身份验证。您想在这里实现什么目标? @Abhijeet 如果提供了无效令牌,我想跳过策略执行。在这里追踪github.com/prajintst/log 【参考方案1】:

根据 Keycloak 架构图,策略执行检查发生在授权/认证之前。因此,您无法使用策略强制实现预期输出。

我建议您使用策略evaluator/provider 或使用基于角色的授权来实现此目的。

【讨论】:

问题是我们无法拨打未经授权的身份验证电话。如果我们对路径禁用策略执行,它将返回 200 而不是 401。 你应该看看***.com/a/66691974/5790498【参考方案2】:

从这篇文章中查看我的回答:Spring Security Plugin Should Respond with 401 instead of 403

它帮助我正确设置了状态码

【讨论】:

以上是关于对于未经身份验证的请求,Keycloak spring boot 返回 403 而不是 401的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 我无法切换 keycloak 和基本身份验证

Keycloak CIBA 身份验证失败并显示“发送身份验证请求失败”

如何根据请求的范围自定义 KeyCloak 身份验证流程

尝试调用 AIA 时,Keycloak“处理对身份提供者的身份验证请求时出现意外错误”

Spring Boot Keycloak - 每个请求验证 3 次

使用 Keycloak 进行微服务身份验证