Keycloak中的授权机制在数据库中查找角色/权限

时间:2020-09-16 07:04:19

标签: java authorization keycloak

我需要在Keycloak中实现授权机制,该机制会根据角色查看用户数据库中的用户权限。

我无法在Keycloak的管理控制台中管理此类角色和权限,但必须编写一些SPI来实现我的授权逻辑。类似于实现用户存储提供程序以在数据库中查找用户/密码的自动识别功能。

但是我找不到如何实现它。我认为,在身份验证过程中为用户获取有效令牌后,应用程序应将该令牌以及执行操作所需的权限一起发送,以便Keycloak(我自己的SPI实现)将验证令牌并搜索数据库以授予权限

也许授权流程与我的想法(我之前写的东西)不同。

任何线索将不胜感激。

应用程序应如何将令牌+权限发送给Keycloak?

如何实现可响应此类请愿并验证令牌的SPI?

1 个答案:

答案 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
   }

}

希望这有助于您朝正确的方向前进。