<p dir="ltr">We have 3 types of providers:</p>
<p dir="ltr">* Server configured - no config or config from keycloak-server<br>
* Realm configured - config from realm model<br>
* Instance configured - multiple instances per realm</p>
<p dir="ltr">Removing master realm as we plan to do means that realm configured provider factories can get realm from KeycloakContext as there&#39;s only one realm per-session.</p>
<p dir="ltr">For instance configured I propose we add getProvider(Class c, String id, String instanceId) to provider factory. The it&#39;s up to the provider factory itself to extract  the config from the realm model or another source. It also means that the session can easily keep track of these and only create one id+instanceId per session.</p>
<div class="gmail_quote">On 29 Apr 2016 09:43, &quot;Marek Posolda&quot; &lt;<a href="mailto:mposolda@redhat.com">mposolda@redhat.com</a>&gt; wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    <div>
      Yes, AFAIK we have open JIRA for this for a long time ago. <br>
      <br>
      It&#39;s the same issue for IdentityProvider (and maybe some others
      SPI too) that they bypass &quot;official&quot; way for create provider via
      session.getProvider(providerClazz) and hence they are not
      registered in KeycloakSession and &quot;close&quot; method is not called for
      them.<br>
      <br>
      The issue is that our SPI is a bit limited IMO and doesn&#39;t support
      &quot;stateful&quot; providers. The providers are created through
      &quot;ProviderFactory.create(KeycloakSession)&quot;. So the only available
      state of provider ATM is just ProviderFactory + KeycloakSession,
      which is sometimes not sufficient. <br>
      <br>
      <br>
      I can see 2 possibilities to address:<br>
      <br>
      1) Always make the provider implementation &quot;stateless&quot; and ensure
      all the state is passed as argument to provider methods. This is
      what we already do for some providers (for example all methods of
      UserProvider has RealmModel as parameter). So if we rewrite
      UserFederation SPI that UserFederationProviderModel will be passed
      as argument to all methods of UserFederationProvider, then it can
      use &quot;official&quot; way too. <br>
      <br>
      <br>
      2) Improve the SPI, so it can properly support &quot;stateful&quot;
      providers. This is more flexible then (1) and I would go this way
      long term.<br>
      <br>
      I am thinking about something like this:<br>
      <br>
      public interface StatefulProvider&lt;S&gt; extends Provider {<br>
      }<br>
      <br>
      <br>
      public class StatefulProviderFactory&lt;T extends
      StatefulProvider, S&gt; {<br>
      <br>
           <span style="color:#20999d">T </span>create(KeycloakSession
      session, S state);<br>
      <br>
           .......    <br>
      }<br>
      <br>
      <br>
      and on KEycloakSession new method like this:<br>
      <br>
      <pre style="background-color:#ffffff;color:#000000;font-family:&#39;DejaVu Sans Mono&#39;;font-size:9.0pt">&lt;<span style="color:#20999d">S</span>, <span style="color:#20999d">T </span><span style="color:#000080;font-weight:bold">extends </span>StatefulProvider&lt;<span style="color:#20999d">S</span>&gt;&gt; <span style="color:#20999d">T </span>getProvider(Class&lt;<span style="color:#20999d">T</span>&gt; providerClazz, String id, <span style="color:#20999d">S </span>state);</pre>
      <br>
      The &quot;state&quot; will need to properly implement equals and hashCode,
      so the SPI can deal with it and not create another instance of
      StatefulProvider if it was called for this KeycloakSession with
      same state before.<br>
      <br>
      Marek<div class="quoted-text"><br>
      <br>
      <br>
      On 29/04/16 08:00, Stian Thorgersen wrote:<br>
    </div></div>
    <blockquote type="cite"><div class="quoted-text">
      <div dir="ltr">Looking at the code for user federation it looks
        like user federation provider instances with the same
        configuration can be created multiple times for a single
        session. Also they are never closed to resources aren&#39;t
        released.</div>
      <br>
      <fieldset></fieldset>
      <br>
      </div><pre>_______________________________________________
keycloak-dev mailing list
<a href="mailto:keycloak-dev@lists.jboss.org" target="_blank">keycloak-dev@lists.jboss.org</a>
<a href="https://lists.jboss.org/mailman/listinfo/keycloak-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/keycloak-dev</a></pre>
    </blockquote>
    <br>
  </div>

</blockquote></div>