keycloak 403禁止访问访问REST API允许的其余资源时出错

try*_*arn 6 java jboss jetty keycloak

我已经成功使用keycloak 4.1建立了身份验证。现在,我正在设置授权。

注意:

发布似乎比实际更长,因为它包含许多显示配置的图像。在以下SO帖子中也已提及:

与keycloak 403的wildfly集成禁止错误

403禁止错误,在访问密钥克隆中的ClientRepresentation时

Keycloak.loadUserProfile()上的Keycloak 403(禁止)

面对403禁止错误

与keycloak 403的wildfly集成禁止错误

更新:

我使用创建了另一个资源(即自动创建的未删除的默认资源)/*,现在看不到403。但是,当我在应用程序中放入调试器时,我看到在权限列表中仅存在此资源:

AuthorizationContext authzContext =  keycloakSecurityContext.getAuthorizationContext();
java.util.List<Permission> pems = authzContext.getPermissions();
Run Code Online (Sandbox Code Playgroud)

它仅包含默认资源,即带有的资源/*,当它也应在列表中包含资源test_role_resource时。(如果上述配置与获得身份验证的用户的权限,策略,角色匹配)

(原始帖子)问题:

对于所有配置(在下面共享),当我使用授权选项卡下的评估选项进行测试时,结果为允许:

在此处输入图片说明

但是,当我通过邮递员对此资源进行请求时,得到403。

在此处输入图片说明


组态:

1.根据文档,我创建了一个领域角色:role_special_user,并创建了一个具有该角色和角色user的用户:user_special

2.接下来,我的资源服务器/客户端如下所示,并启用完整范围

在此处输入图片说明

3.在授权选项卡下,我创建了一个资源,如下所示:

在此处输入图片说明 在此处输入图片说明

4.基于角色的策略是:

在此处输入图片说明

并使用以下权限映射到资源:

在此处输入图片说明

5.现在,keycloak json是:

{
  "realm": "demo12",
  "auth-server-url": "http://localhost:8180/auth",
  "ssl-required": "none",
  "resource": "server12",
  "credentials": {
    "secret": "XXXXXXX"
  },
  "confidential-port": 0,
  "policy-enforcer": {}
}
Run Code Online (Sandbox Code Playgroud)

6.和Keycloak Jetty适配器配置为:

final String KEYCLOAK_JSON = Constants.KC_CONFIG_JSON_PATH;         
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(KEYCLOAK_JSON);
AdapterConfig keyCloakConfig;
ObjectMapper mapper = new ObjectMapper(new SystemPropertiesJsonParserFactory());
mapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT);          
keyCloakConfig = mapper.readValue(is, AdapterConfig.class);

KeycloakJettyAuthenticator kcAuthenticator = new KeycloakJettyAuthenticator();
keyCloakAuthenticator.setAdapterConfig(keyCloakConfig);
if(kcAuthenticator != null) {
    ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler();
    ConstraintMapping constraintMapping = new ConstraintMapping();
    constraintMapping.setPathSpec("/*");
    Constraint constraint = new Constraint();           
    constraint.setAuthenticate(true);
    constraint.setRoles(new String[]{"**"});
    constraintMapping.setConstraint(constraint);
    securityHandler.addConstraintMapping(constraintMapping);            
    securityHandler.setAuthenticator(kcAuthenticator);
    context.setSecurityHandler(securityHandler);
}
Run Code Online (Sandbox Code Playgroud)

7.此外,解码的jwt令牌样本为:

{
  "jti": "XXXXXXX",
  "exp": 1533798704,
  "nbf": 0,
  "iat": 1533798404,
  "iss": "http://localhost:8180/auth/realms/demo12",
  "aud": "server12",
  "sub": "XXXXXXX",
  "typ": "Bearer",
  "azp": "server12",
  "auth_time": 1533798404,
  "session_state": "XXXXXX",
  "acr": "1",
  "allowed-origins": [],
  "realm_access": {
    "roles": [
      "role_special_user",
      "offline_access",
      "uma_authorization",
      "user"
    ]
  },
  "resource_access": {
    "server12": {
      "roles": [
        "uma_protection"
      ]
    },
    "account": {
      "roles": [
        "manage-account",
        "manage-account-links",
        "view-profile"
      ]
    }
  },
  "scope": "openid email profile",
  "email_verified": false,
  "preferred_username": "user_special"
}
Run Code Online (Sandbox Code Playgroud)

哪一部分配置错误导致403错误?

Sac*_*hin 2

发生这种情况主要有两个原因,

  1. 如果您在本地运行 Keycloak,请检查您的用户是否具有相关访问权限。例如,假设您的“admin”用户需要 CLIENT“realm-management”的 CLIENT ROLE“view-users”才能获取有关用户的信息。因此,请检查您是否已将此角色映射添加到您的用户。

2.如果您已将 Keycloak 托管在某个服务器上,请记住,Keycloak 现在对所有外部 IP 地址默认为 HTTPS。在您的服务器获得 SSL 证书之前,请在领域设置中禁用它。

访问数据库实例(这里我使用PostgresQL)

docker exec -it /bin/bash

然后执行

psql -U YOUR_DB_USER -d YOUR_DB

执行以下命令来检查领域表。

select * from realm;

在领域表中,ssl_required 默认为 EXTERNAL。将其设置为无

update REALM set ssl_required='NONE' where id = 'YOUR_REALM_NAME';

重启keycloak实例并查看结果

docker restart CONTAINER_ID