<div dir="ltr"><div><div><div><div>Thank you all for your explanations!<br><br>We cannot afford downtime for user migration, so the federation provider approach seems to be the most suitable for us.<br></div>After migration of our web application(s), Keycloak should become master storage for user data, so every change on user&#39;s data would establish link to the federation provider, which is removed on successful login. After some operation time (e.g. 1 year) we are going to import the rest of (inactive) users into the Keycloak storage, remove existing federation links (where login was not successful)  and then remove federation provider.<br><br></div>Back to the topic: after all I suppose that retrieval of legacy user data via restful web service would be the most simple solution to access external databases from within Keycloak custom provider context, isn&#39;t it?<br><br>I succeeded to build and run federation provider with a call to a dummy restful web service first.<br></div>One small obstacle: how can I find out on which host Keycloak is running? KeycloakSession seems not to provide such information.<br>This should  help to avoid staging issues (which web service should be requested in which environment). <br></div>Alternative I could derive web service host name from realm name. May be it is anyway not bad idea to give different realm names in different deployment stages for preventing cross linking issues between them.<br></div><div class="gmail_extra"><br><div class="gmail_quote">2015-10-09 7:15 GMT+02:00 Stian Thorgersen <span dir="ltr">&lt;<a href="mailto:sthorger@redhat.com" target="_blank">sthorger@redhat.com</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">One issue with the federation provider is that at least for the time being you can&#39;t deprovision the old store, so you end up with having users in the Keycloak database as well as your old database. In the long run that&#39;ll be more to maintain. It would be great if we provided a way to deprovision a federation provider. It would give you an option of either migrate all users or remove users. Would require either being able to read password hashes (and also a password hash spi), or if that&#39;s not possible users would not be able to login until they have recovered their password over email or an admin has recovered their password for them.</div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On 8 October 2015 at 20:56, Scott Rossillo <span dir="ltr">&lt;<a href="mailto:srossillo@smartling.com" target="_blank">srossillo@smartling.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">One plus of the federation provider approach is that it requires zero downtime. Users start migrating on login rather than shutting down the legacy system, importing users, and bringing things back up.<div><div><br><div>
<div>Scott Rossillo</div><div>Smartling | Senior Software Engineer</div><div><a href="mailto:srossillo@smartling.com" target="_blank">srossillo@smartling.com</a></div><div><br></div><div><span style="color:rgb(169,169,169);font-family:gesta,Arial,Helvetica,sans-serif;font-size:14px;line-height:20px;background-color:rgb(255,255,255)"></span><div style="color:rgb(169,169,169);font-family:gesta,Arial,Helvetica,sans-serif;font-size:14px;line-height:20px;background-color:rgb(255,255,255)"><a href="http://www.sigstr.com/" style="color:rgb(0,124,194);text-decoration:none;background-color:transparent;outline:0px!important" target="_blank"><img alt="Powered by Sigstr" style="border:0px;vertical-align:top;max-width:100%;min-height:auto;width:inherit;color:rgb(99,99,99);font-family:Helvetica;font-size:11px" border="0"></a></div></div>
</div><div><div>
<br><div><blockquote type="cite"><div>On Oct 8, 2015, at 1:49 PM, Stian Thorgersen &lt;<a href="mailto:sthorger@redhat.com" target="_blank">sthorger@redhat.com</a>&gt; wrote:</div><br><div><div dir="ltr">For the database in a user federation provider you can use <span style="font-size:12.8px">JpaConnectionProvider, but then you have to modify our persistence.xml. Alternatively you can create your own EntityManagerFactory within your UserFederationProviderFactory. Downside to that is that you won&#39;t share the connection (and 1pc transaction). We could improve on this in the future as it&#39;s a bit clunky.<br></span><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">The other alternative is that we plan to introduce a password hashing spi. With that you can provide the implementation that can hash passwords according to how you have them saved in your current database. Then you can import the users directly into Keycloak and forget about the user federation provider. To import the users you can either export them from your db to a json file (currently you need a full realm file, but we are looking at doing partial import/export now and with that you&#39;ll be able to import a json file with users only into an existing realm). Alternatively you can use the rest admin api to import them.</span></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 8 October 2015 at 10:17, Valerij Timofeev <span dir="ltr">&lt;<a href="mailto:valerij.timofeev@gmail.com" target="_blank">valerij.timofeev@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Exactly. <div><br><div>Plain text passwords are unknown, so the &quot;custom user federation provider&quot; approach, suggested by <span style="color:rgb(80,0,80);font-size:12.8px">Scott Rossillo in the keycloak-user Digest, Vol 22, Issue 18,</span> seems to be feasible:</div><div><div>- User federation provider searches for the user in the legacy user storage on the 1st login. </div><div>- If the user is found and the password legacy hash matches the value in the legacy user storage, user credential is updated in the Keycloak storage and federation link is removed then (see code snippet below).</div><div><br></div><div>My question is, what would be the best way to access legacy database from within a Keycloak custom provider? </div><div>JPA datasource  for the legacy database is available on the same application server, where the Keycloak server runs (EAP 6.4.3).<br></div><div><br></div><div><br></div><div><table style="font-family:Arial,sans-serif;font-size:1em;background-color:rgb(245,245,245);line-height:1.4em!important" width="100%" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:10px 10px 0px;padding:0px;font-size:1em;width:auto"><span style="color:gray;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">@Override</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">    </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">public</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important"> </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">boolean</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important"> validCredentials(RealmModel realm, UserModel user, List&lt;UserCredentialModel&gt; input)</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">    {</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">        </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">for</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important"> (UserCredentialModel cred : input)</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">        {</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">            </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">if</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important"> (cred.getType().equals(UserCredentialModel.PASSWORD))</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">            {</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><br></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">                </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">return</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important"> </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">this</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">.updateCredential(realm, user, cred);</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><br></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">            } </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">else</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">            {</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">                </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">return</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important"> </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">false</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">; </span><span style="color:rgb(0,130,0);font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">// invalid cred type</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">            }</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">        }</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">        </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">return</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important"> </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">false</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">;</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">    }</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"> </pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">    </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">private</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important"> </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">boolean</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important"> updateCredential(RealmModel realm, UserModel user, UserCredentialModel cred)</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">    {</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">        String password = properties.getProperty(user.getUsername());</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">        </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">if</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important"> (password == </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">null</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">)</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">            </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">return</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important"> </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">false</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">;</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"> </pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">        String encodedPassword = Digest.createPassword(cred.getValue());</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">        </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">boolean</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important"> isPasswordOK = password.equals(encodedPassword);</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">        </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">if</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important"> (isPasswordOK)</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">        {</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">            </span><span style="color:rgb(0,130,0);font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">// save password</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">            session.userStorage().getUserById(user.getId(), realm).updateCredential(cred);</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">            </span><span style="color:rgb(0,130,0);font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">// break the federation link</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">            session.userStorage().getUserById(user.getId(), realm).setFederationLink(</span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">null</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">);</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">        }</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">        </span><span style="color:rgb(0,102,153);font-weight:bold;font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">return</span><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important"> isPasswordOK;</span></pre></td></tr><tr><td style="padding:0em;vertical-align:top;line-height:1.4em!important"><pre style="margin:0px 10px 10px;padding:0px;font-size:1em;width:auto"><span style="font-family:Consolas,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,Courier,monospace!important">    }</span></pre></td></tr></tbody></table><div><div><div class="gmail_extra"><br><div class="gmail_quote">2015-10-08 5:57 GMT+02:00 Stian Thorgersen <span dir="ltr">&lt;<a href="mailto:sthorger@redhat.com" target="_blank">sthorger@redhat.com</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">Do you want to permanently import the users into the Keycloak database?<div class="gmail_extra"><br><div class="gmail_quote"><div><div>On 7 October 2015 at 18:37, Valerij Timofeev <span dir="ltr">&lt;<a href="mailto:valerij.timofeev@gmail.com" target="_blank">valerij.timofeev@gmail.com</a>&gt;</span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div><div dir="ltr"><div><div><div><div>Hi,<br><br></div>in order to import users having encrypted passwords from existing user storage <em></em>I&#39;m implementing user federation provider based on the keycloak example <b><em>keycloak-examples-1.5.0.Final/providers/federation-provider</em></b><em>.<br></em></div>Additionally I considered hints<em> </em>provided by Scott Rossillo in the keycloak-user Digest, Vol 22, Issue 18<br></div><div>Above example works properly when retrieving users from a properties file. The next step in the implementation would be access to the database where users data is stored.<br> <br></div><b>My question: </b>What would be the best practice for accessing database from a custom keycloak provider?<br><br></div>Something like this?<br><br>// KeycloakSession<br>session.getProvider(JpaConnectionProvider.class, &quot;myTS&quot;)<br>                .getEntityManager()<br>                .createQuery(&quot;SELECT... ?<br><div><div><div><div><em><br><br></em></div><div><em><b>keycloak-server.json:</b><br>&quot;connectionsJpa&quot;: {<br>        &quot;default&quot;: {<br>            &quot;dataSource&quot;: &quot;java:jboss/datasources/KeycloakDS&quot;,<br>            &quot;databaseSchema&quot;: &quot;update&quot;<br>        },<br></em>      <em><em>&quot;myTS&quot;: {<br>            &quot;dataSource&quot;: &quot;java:jboss/datasources/myTsDS&quot;<br>        }</em>    }<br><br></em>Thank you,<em><br></em></div><div><em><br></em>Valerij Timofeev<br>Software Engineer<br></div><div>Trusted Shops GmbH<br><br></div><div><br></div></div></div></div></div>
<br></div></div>_______________________________________________<br>
keycloak-user mailing list<br>
<a href="mailto:keycloak-user@lists.jboss.org" target="_blank">keycloak-user@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/keycloak-user" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/keycloak-user</a><br></blockquote></div><br></div></div>
</blockquote></div><br></div></div></div></div></div></div></div>
</blockquote></div><br></div>
_______________________________________________<br>keycloak-user mailing list<br><a href="mailto:keycloak-user@lists.jboss.org" target="_blank">keycloak-user@lists.jboss.org</a><br><a href="https://lists.jboss.org/mailman/listinfo/keycloak-user" target="_blank">https://lists.jboss.org/mailman/listinfo/keycloak-user</a></div></blockquote></div><br></div></div></div></div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>