2017-10-14 148 views
1

我正在使用本指南http://www.keycloak.org/docs/3.2/server_development/topics/user-storage.html來配置用戶聯合。這工作正常,我的用戶可以登錄。KeyCloak用戶聯盟和動態角色

我的用戶存儲在Mysql數據庫中。用戶有不同的角色 - 也存儲在MySQL中。

我不確定如何將角色添加到UserModel。

我實現getUserXXX方法

e.g

@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; 

} 

我現在想將特定角色添加到每個登錄用戶。我該怎麼做?

我UserAdapter延伸AbstractUserAdapterFederatedStorage

回答

1

我使用類似於下面的方法在幾個實現做到了這一點。在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); 
    } 
} 
+0

RoleModel是一個接口。是否有一個現有的助手類,或者我必須實現所有這些方法。 – chege

+0

您只能將現有角色分配給用戶。您可以使用它來獲取現有角色。 realm.getClientByClientId(clientId).getRole(roleName); – Boomer