I want that user roles uploaded from db in keycloak. I have wrote RoleSPI for this, but roles don't load. My role-provider is displayed on server info.
I I created CustomRoleProvider:
public class CustomRoleProvider implements RoleProvider {
@Override
public RoleModel addRealmRole(RealmModel realmModel, String s, String s1) {
return null;
}
@Override
public Stream<RoleModel> getRealmRolesStream(RealmModel realmModel, Integer integer, Integer integer1) {
return null;
}
@Override
public Stream<RoleModel> getRolesStream(RealmModel realmModel, Stream<String> stream, String s, Integer integer, Integer integer1) {
return null;
}
@Override
public boolean removeRole(RoleModel roleModel) {
return false;
}
@Override
public void removeRoles(RealmModel realmModel) {
}
@Override
public RoleModel addClientRole(ClientModel clientModel, String s, String s1) {
return null;
}
@Override
public Stream<RoleModel> getClientRolesStream(ClientModel clientModel, Integer integer, Integer integer1) {
return null;
}
@Override
public void removeRoles(ClientModel clientModel) {
}
@Override
public void close() {
}
@Override
public RoleModel getRealmRole(RealmModel realmModel, String s) {
System.out.println("getRealmRole()");
return roleModel;
}
@Override
public RoleModel getRoleById(RealmModel realmModel, String s) {
System.out.println("getRoleById()");
return roleModel;
}
@Override
public Stream<RoleModel> searchForRolesStream(RealmModel realmModel, String s, Integer integer, Integer integer1) {
System.out.println("searchForRolesStream()");
return roleModelStream;
}
@Override
public RoleModel getClientRole(ClientModel clientModel, String s) {
System.out.println("getClientRole()");
return roleModel;
}
@Override
public Stream<RoleModel> searchForClientRolesStream(ClientModel clientModel, String s, Integer integer, Integer integer1) {
System.out.println("searchForClientRolesStream()");
return roleModelStream;
}
}
My CustomRoleProviderFactory:
public class CustomRoleProviderFactory implements RoleProviderFactory {
@Override
public RoleProvider create(KeycloakSession keycloakSession) {
System.out.println("create");
return new CustomRoleProvider();
}
@Override
public void init(Config.Scope scope) {
}
@Override
public void postInit(KeycloakSessionFactory keycloakSessionFactory) {
}
@Override
public void close() {
}
@Override
public String getId() {
return "role-provider";
}
}
I noticed that the create method was not called after the start of keycloak.
There is org.keycloak.models.RoleProviderFactory in resources\META-INF\services packages:
com.healthec.keycloak.provider.CustomRoleProviderFactory
Do you have any ideas why roles don't loaded?