[keycloak-dev] Progress on LDAP enhancements

Marek Posolda mposolda at redhat.com
Wed May 20 17:33:16 EDT 2015


I think I am finished with step 1 prototype on LDAP enhancements. Right 
now it's just in my local fork 
https://github.com/mposolda/keycloak/tree/ldap , I can't send PR as 
model and admin console are kind of broken in my fork (ATM I am testing 
with some hardcoded configs).

What I did so far:

- Refactoring and simplifying of forked picketlink LDAP code and removed 
some abstractions to make it easier to use

- Added UserFederationMapper SPI. The plan is to be in line with already 
existing ProtocolMappers and IdentityProviderMappers.

- Added LDAPFederationMapper. This mapper is invoked from 
LDAPFederationProvider and provides some callbacks and extension points. 
For more details, see methods and javadoc: 
https://github.com/mposolda/keycloak/blob/ldap/federation/ldap/src/main/java/org/keycloak/federation/ldap/mappers/LDAPFederationMapper.java 
. I have 3 implementations right now:
-- UserAttributeLDAPFederationMapper - This is used to map LDAP 
attributes to UserModel attributes/properties .
-- FullNameLDAPFederationMapper - Many LDAP deployments store fullName 
of user in single LDAP attribute (usually "cn" attribute). So this 
allows to map fullName from LDAP to firstName and lastName on UserModel
-- RoleLDAPFederationMapper - allows to map LDAP roles and user role 
mappings from some DN in LDAP tree to either realm roles or client roles 
of some client. Of course it's not a problem to plug more mappers, so 
it's not an issue to map for example LDAP roles from tree 
"ou=finance,dc=myorg,dc=org" to client roles of client "finance" and 
roles from tree "ou=development,dc=myorg,dc=org" to client roles of 
client "development" etc.

- Minor refactoring of some methods on UserFederationProvider interface. 
I needed to add RealmModel as parameter to some methods (it was already 
in most of them) because RealmModel will be used to retrieve list of 
configured UserFederationMapperModels .


Next planned steps:
- Model - I plan to add CRUD for UserFederationMapperModel to RealmModel 
(similarly like IdentityProviderMapperModel)

- Admin console - I've been thinking about new tab "Mappers" under "User 
Federation". The tab will be active when you have some Federation 
provider chosen and it will allow to add/update/remove mappers for 
particular provider. Again something very similar to already existing 
broker mappers. WDYT?

- Address remaining subtasks of 
https://issues.jboss.org/browse/KEYCLOAK-886 . Not everything will be 
addressed by mappers. For example there is performance issue 
https://issues.jboss.org/browse/KEYCLOAK-838 . I am thinking about 
adding some caching at LDAPIdentityStore level, but also I am thinking 
about some simple per-request caching at UserFederationManager level, 
which might help with federation performance in general (not just 
specific to LDAP). Maybe combination of both? But I am not sure atm...

- DB migration

Question: I wonder if we can put RealmModel accessible from 
UserFederationProviderModel? It shouldn't be a problem from 
implementation perspective as UserFederationProviderModel CRUD methods 
are on RealmModel, so realm can just inject itself before return 
UserFederationProviderModel. Since UserFederationProvider instances are 
created by method "getInstance" on UserFederationProviderFactory, which 
has UserFederationProviderModel as one of parameters, it will make 
RealmModel accessible in UserFederationProvider and hence it won't be 
needed to have RealmModel in signature of methods on UserFederationProvider.

WDYT?

Marek


More information about the keycloak-dev mailing list