代码之家  ›  专栏  ›  技术社区  ›  chege

Keyclope用户联合和动态角色

  •  2
  • chege  · 技术社区  · 8 年前

    我正在使用此指南 http://www.keycloak.org/docs/3.2/server_development/topics/user-storage.html 配置用户联合。这很好,我的用户可以登录。

    我的用户存储在Mysql数据库中。用户有不同的角色-也存储在mysql中。

    我已经实现了getUserXXX方法

    例如

    @Override
    public UserModel getUserByEmail(String email, RealmModel realm) {
        LOGGER.info("LOADING BY EMAIL");
        try (Connection connection = ds.getConnection()) {
            try (PreparedStatement statement = connection.prepareStatement("select * from user where email = ?")) {
                statement.setString(1, email);
                try (ResultSet rs = statement.executeQuery()) {
                    if (rs.next()) {
                        UserEntity user = new UserEntity();
                        user.setEmail(rs.getString("email"));
                        user.setId(rs.getString("email"));
                        user.setPassword(rs.getString("password"));
                        return new UserAdapter(session, realm, model, user);
                    }
                }
            }
        } catch (SQLException ex) {
            LOGGER.error(ex.getMessage(), ex);
        }
    
        return null;
    
    }
    

    现在,我想为每个登录的用户添加特定的角色。我该怎么做?

    My UserAdapter扩展了AbstractUserAdapterFederatedStorage

    1 回复  |  直到 8 年前
        1
  •  1
  •   Boomer    8 年前

    我已经在几个实现中使用了下面这样的方法。在UserModel而不是UserEntity级别上执行。

    void updateRoles(UserModel user, List<RoleModel> rolesToRemove, List<RoleModel> rolesToAdd)
    {
        for (RoleModel role : rolesToRemove)
        {
            user.deleteRoleMapping(role);
        }
        for (RoleModel role : rolesToAdd)
        {
            user.grantRole(role);
        }
    }