我已经成功通过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()
wildfly integration with keycloak 403 forbidden error
我用/*
创建了另一个资源(即自动创建的未删除的默认资源),现在看不到403。但是,当我在应用程序中放入调试器时,我看到权限列表中仅存在以下资源:
AuthorizationContext authzContext = keycloakSecurityContext.getAuthorizationContext();
java.util.List<Permission> pems = authzContext.getPermissions();
它仅包含默认资源,即/*
的资源,当它也应在列表中包含资源 test_role_resource 时。 (如果上述配置与获得身份验证的用户的权限,策略,角色匹配)
使用所有配置(下面共享),当我使用授权标签下的评估选项进行测试时,结果为允许:
但是当我通过邮递员对此资源进行请求时,我得到了403。
1。。在documentation之后,我创建了一个领域角色: role_special_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": {}
}
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错误?
答案 0 :(得分:0)
发生这种情况主要有两个原因,
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