我需要在Keycloak中实现授权机制,它在客户的数据库中查找基于角色的用户权限。
我不能在Keycloak的管理控制台中管理这样的角色和权限,但我必须编写一些SPI来实现我的授权逻辑。类似于实现一个用户存储提供程序,以便在数据库中查找用户/密码身份验证。
但我找不到如何实现它。我认为,在身份验证过程中获得用户的有效令牌后,应用程序应该将该令牌与执行操作所需的权限一起发送,以便Keycloak (我自己的SPI实现)将验证令牌并搜索DB以授予权限。
也许授权的流程和我想的不一样(我之前写的)。
任何线索都将不胜感激。
应用程序应该如何将token +权限发送到Keycloak?
如何实现响应此类请求并验证令牌的SPI?
发布于 2020-09-16 21:06:09
回答你的第一个问题: Keycloak将为你处理授权流程,你不需要担心这一部分。您所需要做的就是通过实现UserStorageProvider接口的方法来为用户提供Storage SPI。密钥罩文档:https://www.keycloak.org/docs/latest/server_development/index.html#_user-storage-spi
要添加角色/权限,您需要实现UserModel接口,该接口具有处理角色/权限的方法。密钥罩文档:https://www.keycloak.org/docs/latest/server_development/index.html#model-interfaces
要将这两者结合起来,需要使用UserStorageProvider从Oracle DB获取用户记录,并填写UserModel字段(电子邮件、姓名、角色等)。
Ex伪代码:
注意:有关更详细的演练,请查看keycloak文档:https://www.keycloak.org/docs/latest/server_development/index.html#simple-read-only-lookup-example
public class OracleDbUserStorageProvider implements UserStorageProvider, UserLookupProvider {
private Map<String, UserModel> loadedUsers = new HashMap<>();
private OracleDbRepository oracleDbRepository;
@Override
public UserModel getUserByUsername(String username, RealmModel realm) {
UserModel user = loadedUsers.get(username);
if (user == null) {
OracleUser oracleUser = oracleDbRepository.getUser(username);
if (oracleUser != null) {
user = convertToUserModel(oracleUser);
loadedUsers.put(username, user);
}
}
return user;
}
private UserModel convertToUserModel(OracleUser oracleUser) {
// take oracleUser attributes and assign to a UserModel instance
return userModel; // user model converted
}
}希望这篇文章能帮你找到正确的方向。
https://stackoverflow.com/questions/63914808
复制相似问题