我需要在Keycloak中实现授权机制,该机制会根据角色查看用户数据库中的用户权限。
我无法在Keycloak的管理控制台中管理此类角色和权限,但必须编写一些SPI来实现我的授权逻辑。类似于实现用户存储提供程序以在数据库中查找用户/密码的自动识别功能。
但是我找不到如何实现它。我认为,在身份验证过程中为用户获取有效令牌后,应用程序应将该令牌以及执行操作所需的权限一起发送,以便Keycloak(我自己的SPI实现)将验证令牌并搜索数据库以授予权限
也许授权流程与我的想法(我之前写的东西)不同。
任何线索将不胜感激。
应用程序应如何将令牌+权限发送给Keycloak?
如何实现可响应此类请愿并验证令牌的SPI?
答案 0 :(得分:1)
要回答第一个问题:Keycloak将为您处理授权流程,您无需担心这部分。您需要做的就是通过实现UserStorageProvider
接口的方法来提供用户存储SPI。
Keycloak文档: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伪代码:
注意:有关更详细的演练,请参阅密钥斗篷文档: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
}
}
希望这有助于您朝正确的方向前进。