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
   }

}

希望这能帮助您找到正确的方向。