gpt4 book ai didi

java - keycloak 403禁止访问错误资源,同时评估api显示允许的错误

转载 作者:行者123 更新时间:2023-12-01 09:42:15 28 4
gpt4 key购买 nike

我已经成功使用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

但是,当我通过 postman 对此资源进行请求时,我得到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 token 样本为:
{
"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错误?

最佳答案

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

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

  • 2.如果您将Keycloak托管在某个服务器上,
    请记住,对于所有外部IP地址,Keycloak现在默认为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

    关于java - keycloak 403禁止访问错误资源,同时评估api显示允许的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51761779/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com