2017-10-14 12 views
1

J'utilise ce guide http://www.keycloak.org/docs/3.2/server_development/topics/user-storage.html pour configurer la fédération d'utilisateurs. Cela fonctionne très bien et mes utilisateurs peuvent se connecter.Fédération d'utilisateurs KeyCloak ET ROLES DYNAMIQUES

Mes utilisateurs sont stockés dans une base de données Mysql. Les utilisateurs ont des rôles différents - également stocker dans mysql.

Je ne suis pas sûr de savoir comment ajouter des rôles au UserModel.

J'ai mis en place des méthodes getUserXXX

par exemple

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

} 

Je veux maintenant ajouter des rôles spécifiques à chacun des utilisateurs qui se connectent. Comment fait-on ça?

Mon UserAdapter étend AbstractUserAdapterFederatedStorage

Répondre

1

Je l'ai fait dans plusieurs applications en utilisant une méthode comme ci-dessous. Faites-le sur le UserModel et non sur le niveau 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 est une interface. Y a-t-il une classe auxiliaire existante ou je dois implémenter toutes ces méthodes. – chege

+0

Vous pouvez uniquement affecter des rôles existants aux utilisateurs. Vous pouvez l'utiliser pour obtenir un rôle existant. realm.getClientByClientId (clientId) .getRole (roleName); – Boomer