Keycloak 中的授权机制在数据库中查找 roles/permissions
Authorization mechanism in Keycloak looking in DB for roles/permissions
我需要在 Keycloak 中实现授权机制,它会根据角色查看我客户的数据库以获得用户许可。
我无法在 Keycloak 的管理控制台中管理此类角色和权限,但我将不得不编写一些 SPI 来实现我的授权逻辑。类似于实施用户存储提供程序以在数据库中查找 user/password 验证。
但我找不到如何实现它。我认为,在身份验证过程中为用户获得有效令牌后,应用程序应发送该令牌以及执行操作所需的权限,以便 Keycloak(我自己的 SPI 实现)将验证令牌并搜索数据库以授予权限.
可能授权流程和我想的不一样(我之前写的)
如有任何线索,我们将不胜感激。
应用程序应该如何将令牌+权限发送给Keycloak?
如何实现响应此类请求并验证令牌的 SPI?
回答您的第一个问题:Keycloak 会为您处理授权流程,您无需担心这部分。您需要做的就是通过实现 UserStorageProvider
接口的方法来提供用户存储 SPI。
Keycloak 文档:https://www.keycloak.org/docs/latest/server_development/index.html#_user-storage-spi
要同时添加 roles/permissions,您需要实现 UserModel
接口,该接口具有处理 roles/permissions 的方法。密钥斗篷文档:https://www.keycloak.org/docs/latest/server_development/index.html#model-interfaces
要结合这两者,您可以使用 UserStorageProvider
从 Oracle 数据库中获取用户记录并填写 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
}
}
希望这能帮助您找到正确的方向。
我需要在 Keycloak 中实现授权机制,它会根据角色查看我客户的数据库以获得用户许可。
我无法在 Keycloak 的管理控制台中管理此类角色和权限,但我将不得不编写一些 SPI 来实现我的授权逻辑。类似于实施用户存储提供程序以在数据库中查找 user/password 验证。
但我找不到如何实现它。我认为,在身份验证过程中为用户获得有效令牌后,应用程序应发送该令牌以及执行操作所需的权限,以便 Keycloak(我自己的 SPI 实现)将验证令牌并搜索数据库以授予权限.
可能授权流程和我想的不一样(我之前写的)
如有任何线索,我们将不胜感激。
应用程序应该如何将令牌+权限发送给Keycloak?
如何实现响应此类请求并验证令牌的 SPI?
回答您的第一个问题:Keycloak 会为您处理授权流程,您无需担心这部分。您需要做的就是通过实现 UserStorageProvider
接口的方法来提供用户存储 SPI。
Keycloak 文档:https://www.keycloak.org/docs/latest/server_development/index.html#_user-storage-spi
要同时添加 roles/permissions,您需要实现 UserModel
接口,该接口具有处理 roles/permissions 的方法。密钥斗篷文档:https://www.keycloak.org/docs/latest/server_development/index.html#model-interfaces
要结合这两者,您可以使用 UserStorageProvider
从 Oracle 数据库中获取用户记录并填写 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
}
}
希望这能帮助您找到正确的方向。