Cédric Bosdonnat - springhttps://bosdonnat.fr/2008-06-26T11:42:00+02:00A geek's perspectiveAlfresco and groups of admins2008-06-26T11:42:00+02:002008-06-26T11:42:00+02:00Cédric Bosdonnattag:bosdonnat.fr,2008-06-26:/alfresco-and-groups-of-admins.html<p>I had to add groups of users as administrators to the Alfresco
configuration. As this is a common requested feature, I will explain how
I did it. This will also be a good example of how to tweak Alfresco
internal classes by overriding its Spring beans. Before reading further,
you …</p><p>I had to add groups of users as administrators to the Alfresco
configuration. As this is a common requested feature, I will explain how
I did it. This will also be a good example of how to tweak Alfresco
internal classes by overriding its Spring beans. Before reading further,
you should have read the <a href="https://bosdonnat.fr/howto-create-a-new-alfresco-module.html">howto on Alfresco modules creation</a>.</p>
<p>In an <code>org.alfresco.sample</code> package in the <code>source/java</code> folder of the
module, add the following class. This class will subclass the default
Alfresco <code>AuthorityService</code> implementation to change only the
<code>setAdminUsers()</code> method defining the administrators from the Spring
configuration.</p>
<div class="highlight"><pre><span></span><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyAuthorityService</span> <span class="kd">extends</span> <span class="n">AuthorityServiceImpl</span> <span class="p">{</span>
<span class="kd">private</span> <span class="n">TransactionService</span> <span class="n">transactionService</span><span class="p">;</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setAdminUsers</span><span class="p">(</span><span class="n">Set</span> <span class="n">pConfig</span><span class="p">)</span> <span class="p">{</span>
<span class="n">UserTransaction</span> <span class="n">txn</span> <span class="o">=</span> <span class="n">transactionService</span><span class="p">.</span><span class="na">getUserTransaction</span><span class="p">();</span>
<span class="k">try</span> <span class="p">{</span>
<span class="n">txn</span><span class="p">.</span><span class="na">begin</span><span class="p">();</span>
<span class="n">HashSet</span> <span class="n">users</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashSet</span><span class="p">();</span>
<span class="n">Iterator</span> <span class="n">iter</span> <span class="o">=</span> <span class="n">pConfig</span><span class="p">.</span><span class="na">iterator</span><span class="p">();</span>
<span class="k">while</span> <span class="p">(</span><span class="n">iter</span><span class="p">.</span><span class="na">hasNext</span><span class="p">())</span> <span class="p">{</span>
<span class="n">String</span> <span class="n">authority</span> <span class="o">=</span> <span class="n">iter</span><span class="p">.</span><span class="na">next</span><span class="p">();</span>
<span class="n">AuthorityType</span> <span class="n">type</span> <span class="o">=</span> <span class="n">AuthorityType</span><span class="p">.</span><span class="na">getAuthorityType</span><span class="p">(</span><span class="n">authority</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">type</span><span class="p">.</span><span class="na">equals</span><span class="p">(</span><span class="n">AuthorityType</span><span class="p">.</span><span class="na">GROUP</span><span class="p">)</span> <span class="o">&&</span> <span class="n">authorityExists</span><span class="p">(</span><span class="n">authority</span><span class="p">))</span> <span class="p">{</span>
<span class="c1">// Get all the group's users</span>
<span class="n">Set</span> <span class="n">groupLogins</span> <span class="o">=</span> <span class="n">getContainedAuthorities</span><span class="p">(</span><span class="n">AuthorityType</span><span class="p">.</span><span class="na">USER</span><span class="p">,</span> <span class="n">authority</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>
<span class="n">users</span><span class="p">.</span><span class="na">addAll</span><span class="p">(</span><span class="n">groupLogins</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">users</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">authority</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kd">super</span><span class="p">.</span><span class="na">setAdminUsers</span><span class="p">(</span><span class="n">users</span><span class="p">);</span>
<span class="n">txn</span><span class="p">.</span><span class="na">commit</span><span class="p">();</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
<span class="k">try</span> <span class="p">{</span> <span class="n">txn</span><span class="p">.</span><span class="na">rollback</span><span class="p">();</span> <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">e1</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setTransactionService</span><span class="p">(</span><span class="n">TransactionService</span> <span class="n">pTransactionService</span><span class="p">)</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="na">transactionService</span> <span class="o">=</span> <span class="n">pTransactionService</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div>
<p>Now that the implementation is changed, we need to tell Alfresco to use
it instead of the default one. For this, add the following bean
definition to the <code>module-context.xml</code> file. This Spring configuration
is a copy of the one in the <code>authority-service-context.xml</code> file with
some changes to use our own implementation. As our implementation needs
the transaction service, it has been added as a property to the bean
configuration.</p>
<div class="highlight"><pre><span></span><code><span class="nt"><bean</span> <span class="na">id=</span><span class="s">"authorityService"</span> <span class="na">class=</span><span class="s">"org.alfresco.sample.MyAuthorityService"</span><span class="nt">></span>
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"authenticationComponent"</span><span class="nt">></span>
<span class="nt"><ref</span> <span class="na">bean=</span><span class="s">"authenticationComponent"</span> <span class="nt">/></span>
<span class="nt"></property></span>
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"personService"</span><span class="nt">></span>
<span class="nt"><ref</span> <span class="na">bean=</span><span class="s">"personService"</span> <span class="nt">/></span>
<span class="nt"></property></span>
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"nodeService"</span><span class="nt">></span>
<span class="nt"><ref</span> <span class="na">bean=</span><span class="s">"nodeService"</span> <span class="nt">/></span>
<span class="nt"></property></span>
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"authorityDAO"</span><span class="nt">></span>
<span class="nt"><ref</span> <span class="na">bean=</span><span class="s">"authorityDAO"</span> <span class="nt">/></span>
<span class="nt"></property></span>
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"permissionServiceSPI"</span><span class="nt">></span>
<span class="nt"><ref</span> <span class="na">bean=</span><span class="s">"permissionServiceImpl"</span> <span class="nt">/></span>
<span class="nt"></property></span>
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"transactionService"</span><span class="nt">></span>
<span class="nt"><ref</span> <span class="na">bean=</span><span class="s">"transactionService"</span> <span class="nt">/></span>
<span class="nt"></property></span>
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"adminUsers"</span><span class="nt">></span>
<span class="nt"><set></span>
<span class="nt"><value></span>admin<span class="nt"></value></span>
<span class="nt"><value></span>GROUP_Administrators<span class="nt"></value></span>
<span class="nt"></set></span>
<span class="nt"></property></span>
<span class="nt"></bean></span>
</code></pre></div>
<p>It is now possible to set the full name of a groupe in the
administrators' list. In the example case, all the users of the
<strong>GROUP_Administrators</strong> group will be administrators of Alfresco. </p>