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

时间:2018-08-09 08:03:33

标签: java jboss jetty keycloak

我已经成功通过keycloak 4.1进行了设置身份验证。现在,我正在设置授权。

注意:

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

wildfly integration with keycloak 403 forbidden error

403 Forbidden error, while access the ClientRepresentation in keycloack

Keycloak 403 (Forbidden) on Keycloak.loadUserProfile()

Facing 403 Forbidden error

wildfly integration with keycloak 403 forbidden error

更新:

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

AuthorizationContext authzContext =  keycloakSecurityContext.getAuthorizationContext();
java.util.List<Permission> pems = authzContext.getPermissions();

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

(原始帖子)问题

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

enter image description here

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

enter image description here


配置:

1。。在documentation之后,我创建了一个领域角色: role_special_user ,并创建了一个用户: user_special 和角色用户

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

enter image description here

3。。在“授权”标签下,创建了如下所示的资源:

enter image description here enter image description here

4。。基于角色的策略是:

enter image description here

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

enter image description here

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": {}
}

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);
}

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"
}

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

1 个答案:

答案 0 :(得分:0)

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

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

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';

重新启动密钥斗篷实例并检查结果

docker restart CONTAINER_ID