try*_*arn 6 java jboss jetty keycloak
我已经成功使用keycloak 4.1建立了身份验证。现在,我正在设置授权。
发布似乎比实际更长,因为它包含许多显示配置的图像。在以下SO帖子中也已提及:
403禁止错误,在访问密钥克隆中的ClientRepresentation时
Keycloak.loadUserProfile()上的Keycloak 403(禁止)
我使用创建了另一个资源(即自动创建的未删除的默认资源)/*,现在看不到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错误?
发生这种情况主要有两个原因,
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
| 归档时间: |
|
| 查看次数: |
1748 次 |
| 最近记录: |