[keycloak-dev] creating JPA user storage provider difficult

Marek Posolda mposolda at redhat.com
Fri Aug 5 04:36:10 EDT 2016


On 04/08/16 16:03, Bill Burke wrote:
>
>
> On 8/4/16 9:56 AM, Marek Posolda wrote:
>> Yep, so we can address this with some sort of "deployer" you 
>> proposed, which will have automatically access to JEE APIs, so people 
>> won't need to declare dependencies on them anywhere? Still people 
>> always need to deal with modules though, if they don't want just JEE, 
>> but also some other different 3rd party dependencies...
> True, but at least we can make a keycloak deployer that is consistent 
> with WARs, etc.  Meaning, those that are experienced writing WARs in 
> Wildfly and using jboss-deployment-structure.xml will not have to be 
> completely retrained to write a keycloak component.
+1
>
>>
>>>>> * Had to use JpaKeycloakTransaction to enlist EntityManager with
>>>>> keycloak transactions.  This means using EJBs is out of the question.
>>>>>
>>>>> This is unacceptable.  Keycloak is supposed to be simple and this is
>>>>> extremely difficult.  When Keycloak was an exploded WAR you could use
>>>>> every Java EE component type as you could just plop your extensions
>>>>> within META-INF/lib.  Classloading was simple as it was all the same
>>>>> classloader.
>>>>>
>>>>> Going forward we need to write an actual deployer for Keycloak
>>>>> extensions that allow you to define Keycloak providers within EE 
>>>>> jars,
>>>>> ears, etc.  Writing an extension to Keycloak should be as easy as
>>>>> writing a Java EE application.  Extension developers should be 
>>>>> able to
>>>>> leverage the entire JBoss/Wildfly platform. Minimally, we also 
>>>>> need to
>>>>> begin and commit/rollback a UserTransaction within a Keycloak request
>>>>> flow so that transaction EE and Spring component layers can function.
>>>> +1 for deployer. Maybe we can try to prototype an example, which 
>>>> uses stuff like EJB and then see what exactly we need to add?
>>>>
>>>> For UserTransaction, we can maybe have the KeycloakTransaction 
>>>> implementation, which will delegate to UserTransaction? Then people 
>>>> can optionally enlist it in their provider if they need it :
>>>>
>>>> session.getTransactionManager().enlistAfterCompletion(new 
>>>> UserTransactionWrapper());
>>>>
>>>> Then Keycloak will automatically take care of commit/rollback this 
>>>> transaction at end of request.
>>> Why wouldn't they just use UserTransaction?
>> In case that KeycloakTransaction is rolled back, then it calls 
>> rollback to all the enlisted delegates. So enlisted 
>> UserTransactionWrapper will then call UserTransaction.rollback as well.
>>
>> Unless we're going to rewrite our transaction API to use JTA? That 
>> will automatically integrate with JPA and infinispan. If people needs 
>> to enlist their own transaction, they need to implement 
>> javax.transaction.xa.XAResource. This looks slightly more complicated 
>> then implement our KeycloakTransaction, but on the other hand, it's a 
>> standard.
>>
> I think we can/should have both.  We automatically begin and enlist a 
> UserTransactionWrapper into the KeycloakTransactionManager at the 
> beginning of a request (in our filter that starts a KeycloakSession).  
> If users want something XA then they implement and integration with 
> JTA.  If they want something simpler, than use our KeycloakTransactions.
+1 assuming that automatically enlist UserTransaction in each request 
won't have any performance (or other) impact.

Marek
>
> Bill



More information about the keycloak-dev mailing list