Modified: 
karaf/site/production/manual/latest-2.3.x/developers-guide/security-framework.html
URL: 
http://svn.apache.org/viewvc/karaf/site/production/manual/latest-2.3.x/developers-guide/security-framework.html?rev=1615948&r1=1615947&r2=1615948&view=diff
==============================================================================
--- 
karaf/site/production/manual/latest-2.3.x/developers-guide/security-framework.html
 (original)
+++ 
karaf/site/production/manual/latest-2.3.x/developers-guide/security-framework.html
 Tue Aug  5 15:46:54 2014
@@ -8,7 +8,7 @@
     <link href="../css/style.css" rel="stylesheet" type="text/css"/>
     <link href="../css/pygmentize.css" rel="stylesheet" type="text/css"/>
     <title>
-      Apache Karaf 2.3.2 Guides
+      Apache Karaf 2.3.7-SNAPSHOT Guides
     </title>
   </head>
   <body>
@@ -101,187 +101,11 @@
               </td>
               <td height="100%" width="100%">
                 <div class="wiki-content">
-<h1 id="Securityframework">Security framework</h1><p>Karaf supports <a 
href="http://download.oracle.com/javase/6/docs/technotes/guides/security/jaas/JAASRefGuide.html";>JAAS</a>
 with some enhancements to allow JAAS to work nicely in an OSGi environment.  
This framework also features an OSGi keystore manager with the ability to 
deploy new keystores or truststores at runtime.  </p><h2 
id="Overview">Overview</h2><p>This feature allows runtime deployment of JAAS 
based configuration for use in various parts of the application. This includes 
the remote console login, which uses the <tt>karaf</tt> realm, but which is 
configured with a dummy login module by default.  These realms can also be used 
by the NMR, JBI components or the JMX server to authenticate users logging in 
or sending messages into the bus.</p><p>In addition to JAAS realms, you can 
also deploy keystores and truststores to secure the remote shell console, 
setting up HTTPS connectors or using certificates for WS-Security.</p><p
 >A very simple XML schema for spring has been defined, allowing the deployment 
 >of a new realm or a new keystore very easily.</p><h2 
 >id="Schema">Schema</h2><p>To override or deploy a new realm, you can use the 
 >following XSD which is supported by a Spring namespace handler and can thus 
 >be defined in a Spring xml configuration file.</p><p>Following is the XML 
 >Schema to use when defining Karaf realms:</p><div class="syntax"><pre 
 >name='code' class='brush: xml; gutter: 
 >false;'><code></code></pre></div><p>You can find the schema at the following 
 ><a href="http://karaf.apache.org/xmlns/jaas/v1.1.0";>location</a>.</p><p>Here 
 >are two examples using this schema:</p><div class="syntax"><pre name='code' 
 >class='brush: xml; gutter: false;'><code>
-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; 
-&lt;blueprint xmlns=&quot;http://www.osgi.org/xmlns/blueprint/v1.0.0&quot;
-           xmlns:jaas=&quot;http://karaf.apache.org/xmlns/jaas/v1.0.0&quot;
-           
xmlns:ext=&quot;http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0&quot;&gt;
-
-    &lt;!-- Bean to allow the $[karaf.base] property to be correctly resolved 
--&gt;
-    &lt;ext:property-placeholder placeholder-prefix=&quot;$[&quot; 
placeholder-suffix=&quot;]&quot;/&gt;
-
-    &lt;type-converters&gt;
-        &lt;bean 
class=&quot;org.apache.karaf.jaas.modules.properties.PropertiesConverter&quot;/&gt;
-    &lt;/type-converters&gt; 
-
-    &lt;jaas:config name=&quot;myrealm&quot;&gt;
-        &lt;jaas:module 
className=&quot;org.apache.karaf.jaas.modules.properties.PropertiesLoginModule&quot;
 
-                     flags=&quot;required&quot;&gt;
-            users = $[karaf.base]/etc/users.properties
-        &lt;/jaas:module&gt;
-    &lt;/jaas:config&gt;
-
-    &lt;service 
interface=&quot;org.apache.karaf.jaas.modules.BackingEngineFactory&quot;&gt;
-        &lt;bean 
class=&quot;org.apache.karaf.jaas.modules.properties.PropertiesBackingEngineFactory&quot;/&gt;
-    &lt;/service&gt;
-
-&lt;/blueprint&gt;</code></pre></div><p>NB: Don't forge to expose the 
BackingEngine as an OSGi service.</p><div class="syntax"><pre name='code' 
class='brush: xml; gutter: false;'><code>
-&lt;jaas:keystore 
xmlns:jaas=&quot;http://karaf.apache.org/xmlns/jaas/v1.1.0&quot;
-               name=&quot;ks&quot;
-               rank=&quot;1&quot;
-               path=&quot;classpath:privatestore.jks&quot;
-               keystorePassword=&quot;keyStorePassword&quot;
-               keyPasswords=&quot;myalias=myAliasPassword&quot;&gt;
-&lt;/jaas:keystore&gt;</code></pre></div><p>The <tt>id</tt> attribute is the 
blueprint id of the bean, but it will be used by default as the name of the 
realm if no <tt>name</tt> attribute is specified.   Additional attributes on 
the <tt>config</tt> elements are a <tt>rank</tt>, which is an integer.  When 
the LoginContext looks for a realm for authenticating a given user, the realms 
registered in the OSGi registry are matched against the required name.  If more 
than one realm is found, the one with the highest rank will be used, thus 
allowing the override of some realms with new values.  The last attribute is 
<tt>publish</tt> which can be set to false to not publish the realm in the OSGi 
registry, thereby disabling the use of this realm.</p><p>Each realm can contain 
one or more module definitions.  Each module identifies a LoginModule and the 
<tt>className</tt> attribute must be set to the class name of the login module 
to use.   Note that this login module must be available from th
 e bundle classloader, so either it has to be defined in the bundle itself, or 
the needed package needs to be correctly imported. The <tt>flags</tt> attribute 
can take one of four values that are explained on the <a 
href="http://svn.apache.org/repos/asf/karaf/tags/karaf-2.0.0/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/ProxyLoginModule.java";>JAAS
 documentation</a>.<br/>The content of the <tt>module</tt> element is parsed as 
a properties file and will be used to further configure the login 
module.</p><p>Deploying such a code will lead to a <a 
href="http://svn.apache.org/repos/asf/karaf/tags/karaf-2.0.0/jaas/config/src/main/java/org/apache/karaf/jaas/config/JaasRealm.java";>JaasRealm</a>
 object in the OSGi registry, which will then be used when using the JAAS login 
module.</p><h3 id="Configurationoverrideanduseoftherankattribute">Configuration 
override and use of the <tt>rank</tt> attribute</h3><p>The <tt>rank</tt> 
attribute on the <tt>config</tt> element is tied to the ranking o
 f the underlying OSGi service.  When the JAAS framework performs an 
authentication, it will use the realm name to find a matching JAAS 
configuration.  If multiple configurations are used, the one with the highest 
<tt>rank</tt> attribute will be used.<br/>So if you want to override the 
default security configuration in Karaf (which is used by the ssh shell, web 
console and JMX layer), you need to deploy a JAAS configuration with the name 
<tt>name="karaf"</tt> and <tt>rank="1"</tt>.</p><div class="syntax"><pre 
name='code' class='brush: xml; gutter: false;'><code>
-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
-&lt;blueprint xmlns=&quot;http://www.osgi.org/xmlns/blueprint/v1.0.0&quot;
-           xmlns:jaas=&quot;http://karaf.apache.org/xmlns/jaas/v1.1.0&quot;
-           
xmlns:ext=&quot;http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0&quot;&gt;
-
-    &lt;!-- Bean to allow the $[karaf.base] property to be correctly resolved 
--&gt;
-    &lt;ext:property-placeholder placeholder-prefix=&quot;$[&quot; 
placeholder-suffix=&quot;]&quot;/&gt;
-
-    &lt;type-converters&gt;
-        &lt;bean 
class=&quot;org.apache.karaf.jaas.modules.properties.PropertiesConverter&quot;/&gt;
-    &lt;/type-converters&gt; 
-
-    &lt;jaas:config name=&quot;karaf&quot; rank=&quot;1&quot;&gt;
-        &lt;jaas:module 
className=&quot;org.apache.karaf.jaas.modules.properties.PropertiesLoginModule&quot;
-                     flags=&quot;required&quot;&gt;
-            users = $[karaf.base]/etc/users.properties
-            ...
-        &lt;/jaas:module&gt;
-    &lt;/jaas:config&gt;
-
-&lt;/blueprint&gt;</code></pre></div><h2 
id="Architecture">Architecture</h2><p>Due to constraints in the JAAS 
specification, one class has to be available for all bundles.  This class is 
called <a 
href="http://svn.apache.org/repos/asf/karaf/tags/karaf-2.0.0/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/ProxyLoginModule.java";>ProxyLoginModule</a>
 and is a LoginModule that acts as a proxy for an OSGi defines LoginModule.  If 
you plan to integrate this feature into another OSGi runtime, this class must 
be made available from the system classloader and the related package be part 
of the boot delegation classpath (or be deployed as a fragment attached to the 
system bundle).</p><p>The xml schema defined above allows the use of a simple 
xml (leveraging spring xml extensibility) to configure and register a JAAS 
configuration for a given realm.  This configuration will be made available 
into the OSGi registry as a <a 
href="http://svn.apache.org/repos/asf/karaf/tags/karaf-2.0.0/jaas/conf
 ig/src/main/java/org/apache/karaf/jaas/config/JaasRealm.java">JaasRealm</a> 
and the OSGi specific Configuration will look for such services.  Then the 
proxy login module will be able to use the information provided by the realm to 
actually load the class from the bundle containing the real login 
module.</p><h2 id="Availablerealms">Available realms</h2><p>Karaf comes with 
several login modules to handle authentication needs for your 
environment.</p><h3 id="PropertiesLoginModule">PropertiesLoginModule</h3><div 
class="table-wrap"><table class="confluenceTable"><tr><td class="confluenceTd"> 
LoginModule           </td><td class="confluenceTd"> 
org.apache.karaf.jaas.modules.properties.PropertiesLoginModule            
</td></tr><tr><td class="confluenceTd"> BackingEngineFactory  </td><td 
class="confluenceTd"> 
org.apache.karaf.jaas.modules.properties.PropertiesBackingEngineFactory   
</td></tr></table></div><p>This login module is the one configured by default.  
It uses a properties text fil
 e to load the users, passwords and roles.  </p><div class="table-wrap"><table 
class="confluenceTable"><tr><th class="confluenceTh"> Name             </th><th 
class="confluenceTh"> Description </th></tr><tr><td class="confluenceTd"> 
<tt>users</tt>          </td><td class="confluenceTd"> location of the 
properties file </td></tr></table></div><p>This file uses the <a 
href="http://download.oracle.com/javase/6/docs/api/java/util/Properties.html#load(java.io.Reader)">properties
 file format</a>.<br/>The format of the properties is as follows, with each 
line defining a user, its password and associated roles:</p><pre>
+<h1 id="Securityframework">Security framework</h1><p>Karaf supports <a 
href="http://download.oracle.com/javase/6/docs/technotes/guides/security/jaas/JAASRefGuide.html";>JAAS</a>
 with some enhancements to allow JAAS to work nicely in an OSGi environment.  
This framework also features an OSGi keystore manager with the ability to 
deploy new keystores or truststores at runtime.  </p><h2 
id="Overview">Overview</h2><p>This feature allows runtime deployment of JAAS 
based configuration for use in various parts of the application. This includes 
the remote console login, which uses the <tt>karaf</tt> realm, but which is 
configured with a dummy login module by default.  These realms can also be used 
by the NMR, JBI components or the JMX server to authenticate users logging in 
or sending messages into the bus.</p><p>In addition to JAAS realms, you can 
also deploy keystores and truststores to secure the remote shell console, 
setting up HTTPS connectors or using certificates for WS-Security.</p><p
 >A very simple XML schema for spring has been defined, allowing the deployment 
 >of a new realm or a new keystore very easily.</p><h2 
 >id="Schema">Schema</h2><p>To override or deploy a new realm, you can use the 
 >following XSD which is supported by a Spring namespace handler and can thus 
 >be defined in a Spring xml configuration file.</p><p>Following is the XML 
 >Schema to use when defining Karaf realms:</p><div class="syntax"><div 
 >class="highlight"><pre><span class="cp">&lt;?xml version=&quot;1.0&quot; 
 >encoding=&quot;UTF-8&quot;?&gt;</span>&#x000A;<span 
 >class="c">&lt;!--</span>&#x000A;&#x000A;<span class="c">    Licensed to the 
 >Apache Software Foundation (ASF) under one or more</span>&#x000A;<span 
 >class="c">    contributor license agreements.  See the NOTICE file 
 >distributed with</span>&#x000A;<span class="c">    this work for additional 
 >information regarding copyright ownership.</span>&#x000A;<span class="c">    
 >The ASF licenses this file to You under the Apache License, Version 2.0</spa
 n>&#x000A;<span class="c">    (the &quot;License&quot;); you may not use this 
file except in compliance with</span>&#x000A;<span class="c">    the License.  
You may obtain a copy of the License at</span>&#x000A;&#x000A;<span class="c">  
     http://www.apache.org/licenses/LICENSE-2.0</span>&#x000A;&#x000A;<span 
class="c">    Unless required by applicable law or agreed to in writing, 
software</span>&#x000A;<span class="c">    distributed under the License is 
distributed on an &quot;AS IS&quot; BASIS,</span>&#x000A;<span class="c">    
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
implied.</span>&#x000A;<span class="c">    See the License for the specific 
language governing permissions and</span>&#x000A;<span class="c">    
limitations under the License.</span>&#x000A;&#x000A;<span 
class="c">--&gt;</span>&#x000A;<span class="nt">&lt;xs:schema</span> <span 
class="na">elementFormDefault=</span><span 
class="s">&#39;qualified&#39;</span>&#x000A;           <span class="na">
 targetNamespace=</span><span 
class="s">&#39;http://karaf.apache.org/xmlns/jaas/v1.1.0&#39;</span>&#x000A;    
       <span class="na">xmlns:xs=</span><span 
class="s">&#39;http://www.w3.org/2001/XMLSchema&#39;</span>&#x000A;           
<span class="na">xmlns:bp=</span><span 
class="s">&quot;http://www.osgi.org/xmlns/blueprint/v1.0.0&quot;</span>&#x000A; 
          <span class="na">xmlns:tns=</span><span 
class="s">&#39;http://karaf.apache.org/xmlns/jaas/v1.1.0&#39;</span><span 
class="nt">&gt;</span>&#x000A;&#x000A;    <span class="nt">&lt;xs:import</span> 
<span class="na">namespace=</span><span 
class="s">&quot;http://www.osgi.org/xmlns/blueprint/v1.0.0&quot;</span><span 
class="nt">/&gt;</span>&#x000A;&#x000A;    <span 
class="nt">&lt;xs:element</span> <span class="na">name=</span><span 
class="s">&quot;config&quot;</span><span class="nt">&gt;</span>&#x000A;        
<span class="nt">&lt;xs:complexType&gt;</span>&#x000A;            <span 
class="nt">&lt;xs:sequence&gt;</span>&#x000A;           
      <span class="nt">&lt;xs:element</span> <span class="na">name=</span><span 
class="s">&quot;module&quot;</span> <span class="na">minOccurs=</span><span 
class="s">&quot;0&quot;</span> <span class="na">maxOccurs=</span><span 
class="s">&quot;unbounded&quot;</span><span class="nt">&gt;</span>&#x000A;      
              <span class="nt">&lt;xs:complexType</span> <span 
class="na">mixed=</span><span class="s">&quot;true&quot;</span><span 
class="nt">&gt;</span>&#x000A;                        <span 
class="nt">&lt;xs:attribute</span> <span class="na">name=</span><span 
class="s">&quot;name&quot;</span> <span class="na">use=</span><span 
class="s">&quot;optional&quot;</span> <span class="na">type=</span><span 
class="s">&quot;xs:string&quot;</span><span class="nt">/&gt;</span>&#x000A;     
                   <span class="nt">&lt;xs:attribute</span> <span 
class="na">name=</span><span class="s">&quot;className&quot;</span> <span 
class="na">use=</span><span class="s">&quot;required&quot;</span> <s
 pan class="na">type=</span><span class="s">&quot;xs:string&quot;</span><span 
class="nt">/&gt;</span>&#x000A;                        <span 
class="nt">&lt;xs:attribute</span> <span class="na">name=</span><span 
class="s">&quot;flags&quot;</span> <span class="na">default=</span><span 
class="s">&quot;required&quot;</span><span class="nt">&gt;</span>&#x000A;       
                     <span class="nt">&lt;xs:simpleType&gt;</span>&#x000A;      
                          <span class="nt">&lt;xs:restriction</span> <span 
class="na">base=</span><span class="s">&quot;xs:NMTOKEN&quot;</span><span 
class="nt">&gt;</span>&#x000A;                                    <span 
class="nt">&lt;xs:enumeration</span> <span class="na">value=</span><span 
class="s">&quot;required&quot;</span><span class="nt">/&gt;</span>&#x000A;      
                              <span class="nt">&lt;xs:enumeration</span> <span 
class="na">value=</span><span class="s">&quot;requisite&quot;</span><span 
class="nt">/&gt;</span>&#x000
 A;                                    <span 
class="nt">&lt;xs:enumeration</span> <span class="na">value=</span><span 
class="s">&quot;sufficient&quot;</span><span class="nt">/&gt;</span>&#x000A;    
                                <span class="nt">&lt;xs:enumeration</span> 
<span class="na">value=</span><span class="s">&quot;optional&quot;</span><span 
class="nt">/&gt;</span>&#x000A;                                <span 
class="nt">&lt;/xs:restriction&gt;</span>&#x000A;                            
<span class="nt">&lt;/xs:simpleType&gt;</span>&#x000A;                        
<span class="nt">&lt;/xs:attribute&gt;</span>&#x000A;                    <span 
class="nt">&lt;/xs:complexType&gt;</span>&#x000A;                <span 
class="nt">&lt;/xs:element&gt;</span>&#x000A;            <span 
class="nt">&lt;/xs:sequence&gt;</span>&#x000A;            <span 
class="nt">&lt;xs:attribute</span> <span class="na">name=</span><span 
class="s">&quot;name&quot;</span> <span class="na">use=</span><span class="
 s">&quot;required&quot;</span> <span class="na">type=</span><span 
class="s">&quot;xs:string&quot;</span><span class="nt">/&gt;</span>&#x000A;     
       <span class="nt">&lt;xs:attribute</span> <span 
class="na">name=</span><span class="s">&quot;rank&quot;</span> <span 
class="na">use=</span><span class="s">&quot;optional&quot;</span> <span 
class="na">default=</span><span class="s">&quot;0&quot;</span> <span 
class="na">type=</span><span class="s">&quot;xs:int&quot;</span><span 
class="nt">/&gt;</span>&#x000A;        <span 
class="nt">&lt;/xs:complexType&gt;</span>&#x000A;    <span 
class="nt">&lt;/xs:element&gt;</span>&#x000A;&#x000A;    <span 
class="nt">&lt;xs:element</span> <span class="na">name=</span><span 
class="s">&quot;keystore&quot;</span><span class="nt">&gt;</span>&#x000A;       
 <span class="nt">&lt;xs:complexType&gt;</span>&#x000A;            <span 
class="nt">&lt;xs:attribute</span> <span class="na">name=</span><span 
class="s">&quot;name&quot;</span> <span class="na">use=</sp
 an><span class="s">&quot;required&quot;</span> <span 
class="na">type=</span><span class="s">&quot;xs:string&quot;</span><span 
class="nt">/&gt;</span>&#x000A;            <span 
class="nt">&lt;xs:attribute</span> <span class="na">name=</span><span 
class="s">&quot;rank&quot;</span> <span class="na">use=</span><span 
class="s">&quot;optional&quot;</span> <span class="na">default=</span><span 
class="s">&quot;0&quot;</span> <span class="na">type=</span><span 
class="s">&quot;xs:int&quot;</span><span class="nt">/&gt;</span>&#x000A;        
    <span class="nt">&lt;xs:attribute</span> <span class="na">name=</span><span 
class="s">&quot;path&quot;</span> <span class="na">use=</span><span 
class="s">&quot;required&quot;</span> <span class="na">type=</span><span 
class="s">&quot;xs:string&quot;</span><span class="nt">/&gt;</span>&#x000A;     
       <span class="nt">&lt;xs:attribute</span> <span 
class="na">name=</span><span class="s">&quot;keystorePassword&quot;</span> 
<span class="na">use=</span><spa
 n class="s">&quot;optional&quot;</span> <span class="na">type=</span><span 
class="s">&quot;xs:string&quot;</span><span class="nt">/&gt;</span>&#x000A;     
       <span class="nt">&lt;xs:attribute</span> <span 
class="na">name=</span><span class="s">&quot;keyPasswords&quot;</span> <span 
class="na">use=</span><span class="s">&quot;optional&quot;</span> <span 
class="na">type=</span><span class="s">&quot;xs:string&quot;</span><span 
class="nt">/&gt;</span>&#x000A;        <span 
class="nt">&lt;/xs:complexType&gt;</span>&#x000A;    <span 
class="nt">&lt;/xs:element&gt;</span>&#x000A;&#x000A;<span 
class="nt">&lt;/xs:schema&gt;</span>&#x000A;</pre></div>&#x000A;</div><p>You 
can find the schema at the following <a 
href="http://karaf.apache.org/xmlns/jaas/v1.1.0";>location</a>.</p><p>Here are 
two examples using this schema:</p><div class="syntax"><div 
class="highlight"><pre><span class="cp">&lt;?xml version=&quot;1.0&quot; 
encoding=&quot;UTF-8&quot;?&gt;</span> &#x000A;<span class="nt">&lt;bluepri
 nt</span> <span class="na">xmlns=</span><span 
class="s">&quot;http://www.osgi.org/xmlns/blueprint/v1.0.0&quot;</span>&#x000A; 
          <span class="na">xmlns:jaas=</span><span 
class="s">&quot;http://karaf.apache.org/xmlns/jaas/v1.0.0&quot;</span>&#x000A;  
         <span class="na">xmlns:ext=</span><span 
class="s">&quot;http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0&quot;</span><span
 class="nt">&gt;</span>&#x000A;&#x000A;    <span 
class="nt">&lt;type-converters&gt;</span>&#x000A;        <span 
class="nt">&lt;bean</span> <span class="na">class=</span><span 
class="s">&quot;org.apache.karaf.jaas.modules.properties.PropertiesConverter&quot;</span><span
 class="nt">/&gt;</span>&#x000A;    <span 
class="nt">&lt;/type-converters&gt;</span> &#x000A;&#x000A;    <span 
class="c">&lt;!-- Bean to allow the $[karaf.base] property to be correctly 
resolved --&gt;</span>&#x000A;    <span 
class="nt">&lt;ext:property-placeholder</span> <span 
class="na">placeholder-prefix=</span><span class=
 "s">&quot;$[&quot;</span> <span class="na">placeholder-suffix=</span><span 
class="s">&quot;]&quot;</span><span class="nt">/&gt;</span>&#x000A;&#x000A;    
<span class="nt">&lt;jaas:config</span> <span class="na">name=</span><span 
class="s">&quot;myrealm&quot;</span><span class="nt">&gt;</span>&#x000A;        
<span class="nt">&lt;jaas:module</span> <span class="na">className=</span><span 
class="s">&quot;org.apache.karaf.jaas.modules.properties.PropertiesLoginModule&quot;</span>
 &#x000A;                     <span class="na">flags=</span><span 
class="s">&quot;required&quot;</span><span class="nt">&gt;</span>&#x000A;       
     users = $[karaf.base]/etc/users.properties&#x000A;        <span 
class="nt">&lt;/jaas:module&gt;</span>&#x000A;    <span 
class="nt">&lt;/jaas:config&gt;</span>&#x000A;&#x000A;    <span 
class="nt">&lt;service</span> <span class="na">interface=</span><span 
class="s">&quot;org.apache.karaf.jaas.modules.BackingEngineFactory&quot;</span><span
 class="nt">&gt;</span>&#x00
 0A;        <span class="nt">&lt;bean</span> <span 
class="na">class=</span><span 
class="s">&quot;org.apache.karaf.jaas.modules.properties.PropertiesBackingEngineFactory&quot;</span><span
 class="nt">/&gt;</span>&#x000A;    <span 
class="nt">&lt;/service&gt;</span>&#x000A;&#x000A;<span 
class="nt">&lt;/blueprint&gt;</span>&#x000A;</pre></div>&#x000A;</div><p>NB: 
Don't forge to expose the BackingEngine as an OSGi service.</p><div 
class="syntax"><div class="highlight"><pre><span 
class="nt">&lt;jaas:keystore</span> <span class="na">xmlns:jaas=</span><span 
class="s">&quot;http://karaf.apache.org/xmlns/jaas/v1.1.0&quot;</span>&#x000A;  
             <span class="na">name=</span><span 
class="s">&quot;ks&quot;</span>&#x000A;               <span 
class="na">rank=</span><span class="s">&quot;1&quot;</span>&#x000A;             
  <span class="na">path=</span><span 
class="s">&quot;classpath:privatestore.jks&quot;</span>&#x000A;               
<span class="na">keystorePassword=</span><span class="s">&qu
 ot;keyStorePassword&quot;</span>&#x000A;               <span 
class="na">keyPasswords=</span><span 
class="s">&quot;myalias=myAliasPassword&quot;</span><span 
class="nt">&gt;</span>&#x000A;<span 
class="nt">&lt;/jaas:keystore&gt;</span>&#x000A;</pre></div>&#x000A;</div><p>The
 <tt>id</tt> attribute is the blueprint id of the bean, but it will be used by 
default as the name of the realm if no <tt>name</tt> attribute is specified.   
Additional attributes on the <tt>config</tt> elements are a <tt>rank</tt>, 
which is an integer.  When the LoginContext looks for a realm for 
authenticating a given user, the realms registered in the OSGi registry are 
matched against the required name.  If more than one realm is found, the one 
with the highest rank will be used, thus allowing the override of some realms 
with new values.  The last attribute is <tt>publish</tt> which can be set to 
false to not publish the realm in the OSGi registry, thereby disabling the use 
of this realm.</p><p>Each realm can con
 tain one or more module definitions.  Each module identifies a LoginModule and 
the <tt>className</tt> attribute must be set to the class name of the login 
module to use.   Note that this login module must be available from the bundle 
classloader, so either it has to be defined in the bundle itself, or the needed 
package needs to be correctly imported. The <tt>flags</tt> attribute can take 
one of four values that are explained on the <a 
href="http://svn.apache.org/repos/asf/karaf/tags/karaf-2.0.0/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/ProxyLoginModule.java";>JAAS
 documentation</a>.<br/>The content of the <tt>module</tt> element is parsed as 
a properties file and will be used to further configure the login 
module.</p><p>Deploying such a code will lead to a <a 
href="http://svn.apache.org/repos/asf/karaf/tags/karaf-2.0.0/jaas/config/src/main/java/org/apache/karaf/jaas/config/JaasRealm.java";>JaasRealm</a>
 object in the OSGi registry, which will then be used when using the JAAS
  login module.</p><h3 
id="Configurationoverrideanduseoftherankattribute">Configuration override and 
use of the <tt>rank</tt> attribute</h3><p>The <tt>rank</tt> attribute on the 
<tt>config</tt> element is tied to the ranking of the underlying OSGi service.  
When the JAAS framework performs an authentication, it will use the realm name 
to find a matching JAAS configuration.  If multiple configurations are used, 
the one with the highest <tt>rank</tt> attribute will be used.<br/>So if you 
want to override the default security configuration in Karaf (which is used by 
the ssh shell, web console and JMX layer), you need to deploy a JAAS 
configuration with the name <tt>name="karaf"</tt> and 
<tt>rank="1"</tt>.</p><div class="syntax"><div class="highlight"><pre><span 
class="cp">&lt;?xml version=&quot;1.0&quot; 
encoding=&quot;UTF-8&quot;?&gt;</span>&#x000A;<span 
class="nt">&lt;blueprint</span> <span class="na">xmlns=</span><span 
class="s">&quot;http://www.osgi.org/xmlns/blueprint/v1.0.0&quot;<
 /span>&#x000A;           <span class="na">xmlns:jaas=</span><span 
class="s">&quot;http://karaf.apache.org/xmlns/jaas/v1.1.0&quot;</span>&#x000A;  
         <span class="na">xmlns:ext=</span><span 
class="s">&quot;http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0&quot;</span><span
 class="nt">&gt;</span>&#x000A;&#x000A;    <span class="c">&lt;!-- Bean to 
allow the $[karaf.base] property to be correctly resolved --&gt;</span>&#x000A; 
   <span class="nt">&lt;ext:property-placeholder</span> <span 
class="na">placeholder-prefix=</span><span class="s">&quot;$[&quot;</span> 
<span class="na">placeholder-suffix=</span><span 
class="s">&quot;]&quot;</span><span class="nt">/&gt;</span>&#x000A;&#x000A;    
<span class="nt">&lt;type-converters&gt;</span>&#x000A;        <span 
class="nt">&lt;bean</span> <span class="na">class=</span><span 
class="s">&quot;org.apache.karaf.jaas.modules.properties.PropertiesConverter&quot;</span><span
 class="nt">/&gt;</span>&#x000A;    <span class="nt">&lt;/type
 -converters&gt;</span> &#x000A;&#x000A;    <span 
class="nt">&lt;jaas:config</span> <span class="na">name=</span><span 
class="s">&quot;karaf&quot;</span> <span class="na">rank=</span><span 
class="s">&quot;1&quot;</span><span class="nt">&gt;</span>&#x000A;        <span 
class="nt">&lt;jaas:module</span> <span class="na">className=</span><span 
class="s">&quot;org.apache.karaf.jaas.modules.properties.PropertiesLoginModule&quot;</span>&#x000A;
                     <span class="na">flags=</span><span 
class="s">&quot;required&quot;</span><span class="nt">&gt;</span>&#x000A;       
     users = $[karaf.base]/etc/users.properties&#x000A;            ...&#x000A;  
      <span class="nt">&lt;/jaas:module&gt;</span>&#x000A;    <span 
class="nt">&lt;/jaas:config&gt;</span>&#x000A;&#x000A;<span 
class="nt">&lt;/blueprint&gt;</span>&#x000A;</pre></div>&#x000A;</div><h2 
id="Architecture">Architecture</h2><p>Due to constraints in the JAAS 
specification, one class has to be available for all bundles.  This 
 class is called <a 
href="http://svn.apache.org/repos/asf/karaf/tags/karaf-2.0.0/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/ProxyLoginModule.java";>ProxyLoginModule</a>
 and is a LoginModule that acts as a proxy for an OSGi defines LoginModule.  If 
you plan to integrate this feature into another OSGi runtime, this class must 
be made available from the system classloader and the related package be part 
of the boot delegation classpath (or be deployed as a fragment attached to the 
system bundle).</p><p>The xml schema defined above allows the use of a simple 
xml (leveraging spring xml extensibility) to configure and register a JAAS 
configuration for a given realm.  This configuration will be made available 
into the OSGi registry as a <a 
href="http://svn.apache.org/repos/asf/karaf/tags/karaf-2.0.0/jaas/config/src/main/java/org/apache/karaf/jaas/config/JaasRealm.java";>JaasRealm</a>
 and the OSGi specific Configuration will look for such services.  Then the 
proxy login module will be 
 able to use the information provided by the realm to actually load the class 
from the bundle containing the real login module.</p><h2 
id="Availablerealms">Available realms</h2><p>Karaf comes with several login 
modules to handle authentication needs for your environment.</p><h3 
id="PropertiesLoginModule">PropertiesLoginModule</h3><div 
class="table-wrap"><table class="confluenceTable"><tr><td class="confluenceTd"> 
LoginModule           </td><td class="confluenceTd"> 
org.apache.karaf.jaas.modules.properties.PropertiesLoginModule            
</td></tr><tr><td class="confluenceTd"> BackingEngineFactory  </td><td 
class="confluenceTd"> 
org.apache.karaf.jaas.modules.properties.PropertiesBackingEngineFactory   
</td></tr></table></div><p>This login module is the one configured by default.  
It uses a properties text file to load the users, passwords and roles.  
</p><div class="table-wrap"><table class="confluenceTable"><tr><th 
class="confluenceTh"> Name             </th><th class="confluenceTh"
 > Description </th></tr><tr><td class="confluenceTd"> <tt>users</tt>          
 > </td><td class="confluenceTd"> location of the properties file 
 > </td></tr></table></div><p>This file uses the <a 
 > href="http://download.oracle.com/javase/6/docs/api/java/util/Properties.html#load(java.io.Reader)">properties
 >  file format</a>.<br/>The format of the properties is as follows, with each 
 > line defining a user, its password and associated roles:</p><pre>
 user=password[,role][,role]...
-</pre><div class="syntax"><pre name='code' class='brush: xml; gutter: 
false;'><code>
-&lt;jaas:config name=&quot;karaf&quot;&gt;
-    &lt;jaas:module 
className=&quot;org.apache.karaf.jaas.modules.properties.PropertiesLoginModule&quot;
 
-                 flags=&quot;required&quot;&gt;
-        users = $[karaf.base]/etc/users.properties
-    &lt;/jaas:module&gt;
-&lt;/jaas:config&gt;</code></pre></div><p>Note for windows users: Do not 
forget the typeconverter from the first config snippet. It makes sure that 
windows paths are handled correctly.</p><h3 
id="OsgiConfigLoginModule">OsgiConfigLoginModule</h3><div 
class="table-wrap"><table class="confluenceTable"><tr><td class="confluenceTd"> 
LoginModule           </td><td class="confluenceTd"> 
org.apache.karaf.jaas.modules.osgi.OsgiConfigLoginModule            
</td></tr><tr><td class="confluenceTd"> BackingEngineFactory  </td><td 
class="confluenceTd">                                                           
          </td></tr></table></div><p>The OsgiConfigLoginModule uses the OSGi 
ConfigurationAdmin service to provide the users, passwords and roles.</p><div 
class="table-wrap"><table class="confluenceTable"><tr><th class="confluenceTh"> 
Name           </th><th class="confluenceTh"> Description </th></tr><tr><td 
class="confluenceTd"> <tt>pid</tt>          </td><td class="confluenceTd"> the 
PID o
 f the configuration containing user definitions </td></tr></table></div><p>The 
format of the configuration is the same than for the 
<tt>PropertiesLoginModule</tt>.</p><h3 
id="JDBCLoginModule">JDBCLoginModule</h3><div class="table-wrap"><table 
class="confluenceTable"><tr><td class="confluenceTd"> LoginModule           
</td><td class="confluenceTd"> 
org.apache.karaf.jaas.modules.jdbc.JDBCLoginModule            </td></tr><tr><td 
class="confluenceTd"> BackingEngineFactory  </td><td class="confluenceTd"> 
org.apache.karaf.jaas.modules.jdbc.JDBCBackingEngineFactory   
</td></tr></table></div><p>The JDBCLoginModule uses a database to load the 
users, passwords and roles from a provided data source <em>(normal or XA)</em>. 
The data source and the queries for password and role retrieval are 
configurable using the following parameters.</p><div class="table-wrap"><table 
class="confluenceTable"><tr><th class="confluenceTh"> Name                   
</th><th class="confluenceTh"> Description </th></t
 r><tr><td class="confluenceTd"> <tt>datasource</tt>           </td><td 
class="confluenceTd"> The datasource as on OSGi ldap filter or as JDNI 
name</td></tr><tr><td class="confluenceTd"> <tt>query.password</tt>       
</td><td class="confluenceTd"> The SQL query that retries the password of the 
user </td></tr><tr><td class="confluenceTd"> <tt>query.role</tt>           
</td><td class="confluenceTd"> The SQL query that retries the roles of the user 
</td></tr></table></div><p><u>Passing a data source as an OSGi ldap 
filter</u></p><p>To use an OSGi ldap filter, the prefix osgi: needs to be 
provided, as shown below:</p><div class="syntax"><pre name='code' class='brush: 
xml; gutter: false;'><code>
-&lt;jaas:config name=&quot;karaf&quot;&gt;
-    &lt;jaas:module 
className=&quot;org.apache.karaf.jaas.modules.jdbc.JDBCLoginModule&quot; 
-                 flags=&quot;required&quot;&gt;
-        datasource = 
osgi:javax.sql.DataSource/(osgi.jndi.service.name=jdbc/karafdb)
-        query.password = SELECT PASSWORD FROM USERS WHERE USERNAME=?
-        query.role = SELECT ROLE FROM ROLES WHERE USERNAME=?
-    &lt;/jaas:module&gt;
-&lt;/jaas:config&gt;</code></pre></div><p><u>Passing a data source as a JNDI 
name</u></p><p>To use an JNDI name, the prefix jndi: needs to be provided. The 
example below assumes the use of Aries JNDI to expose services via 
JNDI.</p><div class="syntax"><pre name='code' class='brush: xml; gutter: 
false;'><code>
-&lt;jaas:config name=&quot;karaf&quot;&gt;
-    &lt;jaas:module 
className=&quot;org.apache.karaf.jaas.modules.jdbc.JDBCLoginModule&quot; 
-                 flags=&quot;required&quot;&gt;
-        datasource = 
jndi:aries:services/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/karafdb)
-        query.password = SELECT PASSWORD FROM USERS WHERE USERNAME=?
-        query.role = SELECT ROLE FROM ROLES WHERE USERNAME=?
-    &lt;/jaas:module&gt;
-&lt;/jaas:config&gt;</code></pre></div><h3 
id="LDAPLoginModule">LDAPLoginModule</h3><div class="table-wrap"><table 
class="confluenceTable"><tr><td class="confluenceTd"> LoginModule           
</td><td class="confluenceTd"> 
org.apache.karaf.jaas.modules.ldap.LDAPLoginModule            </td></tr><tr><td 
class="confluenceTd"> BackingEngineFactory  </td><td class="confluenceTd">      
                                                         
</td></tr></table></div><p>The LDAPLoginModule uses LDAP to load the users and 
roles and bind the users on the LDAP to check passwords.</p><p>The 
LDAPLoginModule supports the following parameters:</p><div 
class="table-wrap"><table class="confluenceTable"><tr><th class="confluenceTh"> 
Name                      </th><th class="confluenceTh"> Description 
</th></tr><tr><td class="confluenceTd"> <tt>connection.url</tt>          
</td><td class="confluenceTd"> The LDAP connection URL, e.g. ldap://hostname 
</td></tr><tr><td class="confluenceTd"> <tt>connection
 .username</tt>     </td><td class="confluenceTd"> Admin username to connect to 
the LDAP. This parameter is optional, if it's not provided, the LDAP connection 
will be anonymous. </td></tr><tr><td class="confluenceTd"> 
<tt>connection.password</tt>     </td><td class="confluenceTd"> Admin password 
to connect to the LDAP. Only used if the <tt>connection.username</tt> is 
specified. </td></tr><tr><td class="confluenceTd"> <tt>user.base.dn</tt>        
    </td><td class="confluenceTd"> The LDAP base DN used to looking for user, 
e.g. ou=user,dc=apache,dc=org </td></tr><tr><td class="confluenceTd"> 
<tt>user.filter</tt>             </td><td class="confluenceTd"> The LDAP filter 
used to looking for user, e.g. (uid=%u) where %u will be replaced by the 
username. </td></tr><tr><td class="confluenceTd"> <tt>user.search.subtree</tt>  
   </td><td class="confluenceTd"> If "true", the user lookup will be recursive 
(SUBTREE). If "false", the user lookup will be performed only at the first 
level (ONELE
 VEL). </td></tr><tr><td class="confluenceTd"> <tt>role.base.dn</tt>            
</td><td class="confluenceTd"> The LDAP base DN used to looking for roles, e.g. 
ou=role,dc=apache,dc=org </td></tr><tr><td class="confluenceTd"> 
<tt>role.filter</tt>             </td><td class="confluenceTd"> The LDAP filter 
used to looking for user's role, e.g. (member:=uid=%u) </td></tr><tr><td 
class="confluenceTd"> <tt>role.name.attribute</tt>     </td><td 
class="confluenceTd"> The LDAP role attribute containing the role string used 
by Karaf, e.g. cn </td></tr><tr><td class="confluenceTd"> 
<tt>role.search.subtree</tt>     </td><td class="confluenceTd"> If "true", the 
role lookup will be recursive (SUBTREE). If "false", the role lookup will be 
performed only at the first level (ONELEVEL). </td></tr><tr><td 
class="confluenceTd"> <tt>authentication</tt>          </td><td 
class="confluenceTd"> Define the authentication backend used on the LDAP 
server. The default is simple. </td></tr><tr><td class="conflue
 nceTd"> <tt>initial.context.factory</tt> </td><td class="confluenceTd"> Define 
the initial context factory used to connect to the LDAP server. The default is 
com.sun.jndi.ldap.LdapCtxFactory </td></tr><tr><td class="confluenceTd"> 
<tt>ssl</tt>                     </td><td class="confluenceTd"> If "true" or if 
the protocol on the <tt>connection.url</tt> is <tt>ldaps</tt>, an SSL 
connection will be used </td></tr><tr><td class="confluenceTd"> 
<tt>ssl.provider</tt>            </td><td class="confluenceTd"> The provider 
name to use for SSL </td></tr><tr><td class="confluenceTd"> 
<tt>ssl.protocol</tt>            </td><td class="confluenceTd"> The protocol 
name to use for SSL (SSL for example)</td></tr><tr><td class="confluenceTd"> 
<tt>ssl.algorithm</tt>           </td><td class="confluenceTd"> The algorithm 
to use for the KeyManagerFactory and TrustManagerFactory  (PKIX for example) 
</td></tr><tr><td class="confluenceTd"> <tt>ssl.keystore</tt>            
</td><td class="confluenceTd"> Th
 e key store name to use for SSL.  The key store must be deployed using a 
<tt>jaas:keystore</tt> configuration.  </td></tr><tr><td class="confluenceTd"> 
<tt>ssl.keyalias</tt>            </td><td class="confluenceTd"> The key alias 
to use for SSL </td></tr><tr><td class="confluenceTd"> <tt>ssl.truststore</tt>  
        </td><td class="confluenceTd"> The trust store name to use for SSL.  
The trust store must be deployed using a <tt>jaas:keystore</tt> configuration.  
</td></tr></table></div><p>A example of LDAPLoginModule usage follows:</p><div 
class="syntax"><pre name='code' class='brush: xml; gutter: false;'><code>
-&lt;jaas:config name=&quot;karaf&quot;&gt;
-  &lt;jaas:module 
className=&quot;org.apache.karaf.jaas.modules.ldap.LDAPLoginModule&quot; 
flags=&quot;required&quot;&gt;
-        connection.url = ldap://localhost:389
-        user.base.dn = ou=user,dc=apache,dc=org
-        user.filter = (cn=%u)
-        user.search.subtree = true
-        role.base.dn = ou=group,dc=apache,dc=org
-        role.filter = (member:=uid=%u)
-        role.name.attribute = cn
-        role.search.subtree = true
-        authentication = simple
-  &lt;/jaas:module&gt;
-&lt;/jaas:config&gt;</code></pre></div><p>If you wish to use an SSL 
connection, the following configuration can be used as an example:</p><div 
class="syntax"><pre name='code' class='brush: xml; gutter: false;'><code>
-&lt;ext:property-placeholder /&gt;
-
-&lt;jaas:config name=&quot;karaf&quot; rank=&quot;1&quot;&gt;
-    &lt;jaas:module 
className=&quot;org.apache.karaf.jaas.modules.ldap.LDAPLoginModule&quot; 
flags=&quot;required&quot;&gt;
-        connection.url = ldaps://localhost:10636
-        user.base.dn = ou=users,ou=system
-        user.filter = (uid=%u)
-        user.search.subtree = true
-        role.base.dn = ou=groups,ou=system
-        role.filter = (uniqueMember=uid=%u)
-        role.name.attribute = cn
-        role.search.subtree = true
-        authentication = simple
-        ssl.protocol=SSL
-        ssl.truststore=ks
-        ssl.algorithm=PKIX
-    &lt;/jaas:module&gt;
-&lt;/jaas:config&gt;
-
-&lt;jaas:keystore name=&quot;ks&quot;
-               path=&quot;file:///${karaf.home}/etc/trusted.ks&quot;
-               keystorePassword=&quot;secret&quot; /&gt;</code></pre></div><h2 
id="Encryptionservice">Encryption service</h2><p>The <a 
href="http://svn.apache.org/repos/asf/karaf/trunk/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/EncryptionService.java";>EncryptionService</a>
 is a service registered in the OSGi registry providing means to encrypt and 
check encrypted passwords.  This service acts as a factory for <a 
href="http://svn.apache.org/repos/asf/karaf/trunk/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/Encryption.java";>Encryption</a>
 objects actually performing the encryption.</p><p>This service is used in all 
Karaf login modules to support encrypted passwords.</p><h3 
id="Configuringproperties">Configuring properties</h3><p>Each login module 
supports the following additional set of properties:</p><div 
class="table-wrap"><table class="confluenceTable"><tr><th class="confluenceTh"> 
Name                   </th><th class="confluenceTh"> Description </th></tr
 ><tr><td class="confluenceTd"> <tt>encryption.name</tt>      </td><td 
 >class="confluenceTd"> Name of the encryption service registered in OSGi (cf. 
 >paragraph <a href="#Jasypt.html">below</a>) </td></tr><tr><td 
 >class="confluenceTd"> <tt>encryption.enabled</tt>   </td><td 
 >class="confluenceTd"> Boolean used to turn on encryption </td></tr><tr><td 
 >class="confluenceTd"> <tt>encryption.prefix</tt>    </td><td 
 >class="confluenceTd"> Prefix for encrypted passwords </td></tr><tr><td 
 >class="confluenceTd"> <tt>encryption.suffix</tt>    </td><td 
 >class="confluenceTd"> Suffix for encrypted passwords </td></tr><tr><td 
 >class="confluenceTd"> <tt>encryption.algorithm</tt> </td><td 
 >class="confluenceTd"> Name of an algorithm to be used for hashing, like "MD5" 
 >or "SHA-1" </td></tr><tr><td class="confluenceTd"> 
 ><tt>encryption.encoding</tt>  </td><td class="confluenceTd"> Encrypted 
 >passwords encoding (can be <tt>hexadecimal</tt> or <tt>base64</tt>) 
 ></td></tr><tr><td class="confluenceTd"> <tt>role.policy</tt
 >          </td><td class="confluenceTd"> A policy for identifying roles (can 
 > be <tt>prefix</tt> or <tt>group</tt>) <a 
 > href="#Rolediscoverypolicies.html">below</a>) </td></tr><tr><td 
 > class="confluenceTd"> <tt>role.discriminator</tt>   </td><td 
 > class="confluenceTd"> A discriminator value to be used by the role policy 
 > </td></tr></table></div><p>A simple example follows:</p><div 
 > class="syntax"><pre name='code' class='brush: xml; gutter: false;'><code>
-&lt;jaas:config name=&quot;karaf&quot;&gt;
-    &lt;jaas:module 
className=&quot;org.apache.karaf.jaas.modules.properties.PropertiesLoginModule&quot;
 
-                 flags=&quot;required&quot;&gt;
-        users = $[karaf.base]/etc/users.properties
-        encryption.enabled = true
-        encryption.algorithm = MD5
-        encryption.encoding = hexadecimal
-    &lt;/jaas:module&gt;
-&lt;/jaas:config&gt;</code></pre></div><h3 id="Prefixandsuffix">Prefix and 
suffix</h3><p>The login modules have the ability to support both encrypted and 
plain passwords at the same time.  In some cases, some login modules may be 
able to encrypt the passwords on the fly and save them back in an encrypted 
form.</p><h3 id="Jasypt">Jasypt</h3><p>Karaf default installation comes with a 
simple encryption service which usually fulfills simple needs.  However, in 
some cases, you may need to install the <a 
href="http://www.jasypt.org/";>Jasypt</a> library which provides stronger 
encryption algorithms and more control over them.</p><p>To install the Jasypt 
library, the easiest way is to install the available feature:</p><pre>
+</pre><div class="syntax"><div class="highlight"><pre><span 
class="nt">&lt;jaas:config</span> <span class="na">name=</span><span 
class="s">&quot;karaf&quot;</span><span class="nt">&gt;</span>&#x000A;    <span 
class="nt">&lt;jaas:module</span> <span class="na">className=</span><span 
class="s">&quot;org.apache.karaf.jaas.modules.properties.PropertiesLoginModule&quot;</span>
 &#x000A;                 <span class="na">flags=</span><span 
class="s">&quot;required&quot;</span><span class="nt">&gt;</span>&#x000A;       
 users = $[karaf.base]/etc/users.properties&#x000A;    <span 
class="nt">&lt;/jaas:module&gt;</span>&#x000A;<span 
class="nt">&lt;/jaas:config&gt;</span>&#x000A;</pre></div>&#x000A;</div><p>Note 
for windows users: Do not forget the typeconverter from the first config 
snippet. It makes sure that windows paths are handled correctly.</p><h3 
id="OsgiConfigLoginModule">OsgiConfigLoginModule</h3><div 
class="table-wrap"><table class="confluenceTable"><tr><td class="confluenceTd"> 
Login
 Module           </td><td class="confluenceTd"> 
org.apache.karaf.jaas.modules.osgi.OsgiConfigLoginModule            
</td></tr><tr><td class="confluenceTd"> BackingEngineFactory  </td><td 
class="confluenceTd">                                                           
          </td></tr></table></div><p>The OsgiConfigLoginModule uses the OSGi 
ConfigurationAdmin service to provide the users, passwords and roles.</p><div 
class="table-wrap"><table class="confluenceTable"><tr><th class="confluenceTh"> 
Name           </th><th class="confluenceTh"> Description </th></tr><tr><td 
class="confluenceTd"> <tt>pid</tt>          </td><td class="confluenceTd"> the 
PID of the configuration containing user definitions 
</td></tr></table></div><p>The format of the configuration is the same than for 
the <tt>PropertiesLoginModule</tt>.</p><h3 
id="JDBCLoginModule">JDBCLoginModule</h3><div class="table-wrap"><table 
class="confluenceTable"><tr><td class="confluenceTd"> LoginModule           
</td><td class="
 confluenceTd"> org.apache.karaf.jaas.modules.jdbc.JDBCLoginModule            
</td></tr><tr><td class="confluenceTd"> BackingEngineFactory  </td><td 
class="confluenceTd"> 
org.apache.karaf.jaas.modules.jdbc.JDBCBackingEngineFactory   
</td></tr></table></div><p>The JDBCLoginModule uses a database to load the 
users, passwords and roles from a provided data source <em>(normal or XA)</em>. 
The data source and the queries for password and role retrieval are 
configurable using the following parameters.</p><div class="table-wrap"><table 
class="confluenceTable"><tr><th class="confluenceTh"> Name                   
</th><th class="confluenceTh"> Description </th></tr><tr><td 
class="confluenceTd"> <tt>datasource</tt>           </td><td 
class="confluenceTd"> The datasource as on OSGi ldap filter or as JDNI 
name</td></tr><tr><td class="confluenceTd"> <tt>query.password</tt>       
</td><td class="confluenceTd"> The SQL query that retries the password of the 
user </td></tr><tr><td class="confluenceT
 d"> <tt>query.role</tt>           </td><td class="confluenceTd"> The SQL query 
that retries the roles of the user </td></tr></table></div><p><u>Passing a data 
source as an OSGi ldap filter</u></p><p>To use an OSGi ldap filter, the prefix 
osgi: needs to be provided, as shown below:</p><div class="syntax"><div 
class="highlight"><pre><span class="nt">&lt;jaas:config</span> <span 
class="na">name=</span><span class="s">&quot;karaf&quot;</span><span 
class="nt">&gt;</span>&#x000A;    <span class="nt">&lt;jaas:module</span> <span 
class="na">className=</span><span 
class="s">&quot;org.apache.karaf.jaas.modules.jdbc.JDBCLoginModule&quot;</span> 
&#x000A;                 <span class="na">flags=</span><span 
class="s">&quot;required&quot;</span><span class="nt">&gt;</span>&#x000A;       
 datasource = 
osgi:javax.sql.DataSource/(osgi.jndi.service.name=jdbc/karafdb)&#x000A;        
query.password = SELECT PASSWORD FROM USERS WHERE USERNAME=?&#x000A;        
query.role = SELECT ROLE FROM ROLES WHERE USE
 RNAME=?&#x000A;    <span class="nt">&lt;/jaas:module&gt;</span>&#x000A;<span 
class="nt">&lt;/jaas:config&gt;</span>&#x000A;</pre></div>&#x000A;</div><p><u>Passing
 a data source as a JNDI name</u></p><p>To use an JNDI name, the prefix jndi: 
needs to be provided. The example below assumes the use of Aries JNDI to expose 
services via JNDI.</p><div class="syntax"><div class="highlight"><pre><span 
class="nt">&lt;jaas:config</span> <span class="na">name=</span><span 
class="s">&quot;karaf&quot;</span><span class="nt">&gt;</span>&#x000A;    <span 
class="nt">&lt;jaas:module</span> <span class="na">className=</span><span 
class="s">&quot;org.apache.karaf.jaas.modules.jdbc.JDBCLoginModule&quot;</span> 
&#x000A;                 <span class="na">flags=</span><span 
class="s">&quot;required&quot;</span><span class="nt">&gt;</span>&#x000A;       
 datasource = 
jndi:aries:services/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/karafdb)&#x000A;
        query.password = SELECT PASSWORD FROM USERS WHERE
  USERNAME=?&#x000A;        query.role = SELECT ROLE FROM ROLES WHERE 
USERNAME=?&#x000A;    <span class="nt">&lt;/jaas:module&gt;</span>&#x000A;<span 
class="nt">&lt;/jaas:config&gt;</span>&#x000A;</pre></div>&#x000A;</div><h3 
id="LDAPLoginModule">LDAPLoginModule</h3><div class="table-wrap"><table 
class="confluenceTable"><tr><td class="confluenceTd"> LoginModule           
</td><td class="confluenceTd"> 
org.apache.karaf.jaas.modules.ldap.LDAPLoginModule            </td></tr><tr><td 
class="confluenceTd"> BackingEngineFactory  </td><td class="confluenceTd">      
                                                         
</td></tr></table></div><p>The LDAPLoginModule uses LDAP to load the users and 
roles and bind the users on the LDAP to check passwords.</p><p>The 
LDAPLoginModule supports the following parameters:</p><div 
class="table-wrap"><table class="confluenceTable"><tr><th class="confluenceTh"> 
Name                      </th><th class="confluenceTh"> Description 
</th></tr><tr><td clas
 s="confluenceTd"> <tt>connection.url</tt>          </td><td 
class="confluenceTd"> The LDAP connection URL, e.g. ldap://hostname 
</td></tr><tr><td class="confluenceTd"> <tt>connection.username</tt>     
</td><td class="confluenceTd"> Admin username to connect to the LDAP. This 
parameter is optional, if it's not provided, the LDAP connection will be 
anonymous. </td></tr><tr><td class="confluenceTd"> <tt>connection.password</tt> 
    </td><td class="confluenceTd"> Admin password to connect to the LDAP. Only 
used if the <tt>connection.username</tt> is specified. </td></tr><tr><td 
class="confluenceTd"> <tt>user.base.dn</tt>            </td><td 
class="confluenceTd"> The LDAP base DN used to looking for user, e.g. 
ou=user,dc=apache,dc=org </td></tr><tr><td class="confluenceTd"> 
<tt>user.filter</tt>             </td><td class="confluenceTd"> The LDAP filter 
used to looking for user, e.g. (uid=%u) where %u will be replaced by the 
username. </td></tr><tr><td class="confluenceTd"> <tt>user.searc
 h.subtree</tt>     </td><td class="confluenceTd"> If "true", the user lookup 
will be recursive (SUBTREE). If "false", the user lookup will be performed only 
at the first level (ONELEVEL). </td></tr><tr><td class="confluenceTd"> 
<tt>role.base.dn</tt>            </td><td class="confluenceTd"> The LDAP base 
DN used to looking for roles, e.g. ou=role,dc=apache,dc=org </td></tr><tr><td 
class="confluenceTd"> <tt>role.filter</tt>             </td><td 
class="confluenceTd"> The LDAP filter used to looking for user's role, e.g. 
(member:=uid=%u) </td></tr><tr><td class="confluenceTd"> 
<tt>role.name.attribute</tt>     </td><td class="confluenceTd"> The LDAP role 
attribute containing the role string used by Karaf, e.g. cn </td></tr><tr><td 
class="confluenceTd"> <tt>role.search.subtree</tt>     </td><td 
class="confluenceTd"> If "true", the role lookup will be recursive (SUBTREE). 
If "false", the role lookup will be performed only at the first level 
(ONELEVEL). </td></tr><tr><td class="confluenceT
 d"> <tt>authentication</tt>          </td><td class="confluenceTd"> Define the 
authentication backend used on the LDAP server. The default is simple. 
</td></tr><tr><td class="confluenceTd"> <tt>initial.context.factory</tt> 
</td><td class="confluenceTd"> Define the initial context factory used to 
connect to the LDAP server. The default is com.sun.jndi.ldap.LdapCtxFactory 
</td></tr><tr><td class="confluenceTd"> <tt>ssl</tt>                     
</td><td class="confluenceTd"> If "true" or if the protocol on the 
<tt>connection.url</tt> is <tt>ldaps</tt>, an SSL connection will be used 
</td></tr><tr><td class="confluenceTd"> <tt>ssl.provider</tt>            
</td><td class="confluenceTd"> The provider name to use for SSL 
</td></tr><tr><td class="confluenceTd"> <tt>ssl.protocol</tt>            
</td><td class="confluenceTd"> The protocol name to use for SSL (SSL for 
example)</td></tr><tr><td class="confluenceTd"> <tt>ssl.algorithm</tt>          
 </td><td class="confluenceTd"> The algorithm t
 o use for the KeyManagerFactory and TrustManagerFactory  (PKIX for example) 
</td></tr><tr><td class="confluenceTd"> <tt>ssl.keystore</tt>            
</td><td class="confluenceTd"> The key store name to use for SSL.  The key 
store must be deployed using a <tt>jaas:keystore</tt> configuration.  
</td></tr><tr><td class="confluenceTd"> <tt>ssl.keyalias</tt>            
</td><td class="confluenceTd"> The key alias to use for SSL </td></tr><tr><td 
class="confluenceTd"> <tt>ssl.truststore</tt>          </td><td 
class="confluenceTd"> The trust store name to use for SSL.  The trust store 
must be deployed using a <tt>jaas:keystore</tt> configuration.  
</td></tr></table></div><p>A example of LDAPLoginModule usage follows:</p><div 
class="syntax"><div class="highlight"><pre><span 
class="nt">&lt;jaas:config</span> <span class="na">name=</span><span 
class="s">&quot;karaf&quot;</span><span class="nt">&gt;</span>&#x000A;  <span 
class="nt">&lt;jaas:module</span> <span class="na">className=</span><span
  
class="s">&quot;org.apache.karaf.jaas.modules.ldap.LDAPLoginModule&quot;</span> 
<span class="na">flags=</span><span class="s">&quot;required&quot;</span><span 
class="nt">&gt;</span>&#x000A;        connection.url = 
ldap://localhost:389&#x000A;        user.base.dn = 
ou=user,dc=apache,dc=org&#x000A;        user.filter = (cn=%u)&#x000A;        
user.search.subtree = true&#x000A;        role.base.dn = 
ou=group,dc=apache,dc=org&#x000A;        role.filter = (member:=uid=%u)&#x000A; 
       role.name.attribute = cn&#x000A;        role.search.subtree = 
true&#x000A;        authentication = simple&#x000A;  <span 
class="nt">&lt;/jaas:module&gt;</span>&#x000A;<span 
class="nt">&lt;/jaas:config&gt;</span>&#x000A;</pre></div>&#x000A;</div><p>If 
you wish to use an SSL connection, the following configuration can be used as 
an example:</p><div class="syntax"><div class="highlight"><pre><span 
class="nt">&lt;ext:property-placeholder</span> <span 
class="nt">/&gt;</span>&#x000A;&#x000A;<span class="nt">&lt
 ;jaas:config</span> <span class="na">name=</span><span 
class="s">&quot;karaf&quot;</span> <span class="na">rank=</span><span 
class="s">&quot;1&quot;</span><span class="nt">&gt;</span>&#x000A;    <span 
class="nt">&lt;jaas:module</span> <span class="na">className=</span><span 
class="s">&quot;org.apache.karaf.jaas.modules.ldap.LDAPLoginModule&quot;</span> 
<span class="na">flags=</span><span class="s">&quot;required&quot;</span><span 
class="nt">&gt;</span>&#x000A;        connection.url = 
ldaps://localhost:10636&#x000A;        user.base.dn = 
ou=users,ou=system&#x000A;        user.filter = (uid=%u)&#x000A;        
user.search.subtree = true&#x000A;        role.base.dn = 
ou=groups,ou=system&#x000A;        role.filter = (uniqueMember=uid=%u)&#x000A;  
      role.name.attribute = cn&#x000A;        role.search.subtree = 
true&#x000A;        authentication = simple&#x000A;        
ssl.protocol=SSL&#x000A;        ssl.truststore=ks&#x000A;        
ssl.algorithm=PKIX&#x000A;    <span class="nt">&lt;/j
 aas:module&gt;</span>&#x000A;<span 
class="nt">&lt;/jaas:config&gt;</span>&#x000A;&#x000A;<span 
class="nt">&lt;jaas:keystore</span> <span class="na">name=</span><span 
class="s">&quot;ks&quot;</span>&#x000A;               <span 
class="na">path=</span><span 
class="s">&quot;file:///${karaf.home}/etc/trusted.ks&quot;</span>&#x000A;       
        <span class="na">keystorePassword=</span><span 
class="s">&quot;secret&quot;</span> <span 
class="nt">/&gt;</span>&#x000A;</pre></div>&#x000A;</div><p>The LDAPLoginModule 
supports the following patterns that you can use in the filter (user and role 
filters):</p><ul><li><tt>%u</tt> is replaced by the user</li><li><tt>%dn</tt> 
is replaced by the user DN</li><li><tt>%fqdn</tt> is replaced by the user full 
qualified DN (<tt>userDN,userBaseDN</tt>).</li><li><tt>%nsdn</tt> is replaced 
by the userDNNamespace (interesting especially for 
ActiveDirectory).</li></ul><h2 id="Encryptionservice">Encryption 
service</h2><p>The <a href="http://svn.apache.org/repos/
 
asf/karaf/trunk/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/EncryptionService.java">EncryptionService</a>
 is a service registered in the OSGi registry providing means to encrypt and 
check encrypted passwords.  This service acts as a factory for <a 
href="http://svn.apache.org/repos/asf/karaf/trunk/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/Encryption.java";>Encryption</a>
 objects actually performing the encryption.</p><p>This service is used in all 
Karaf login modules to support encrypted passwords.</p><h3 
id="Configuringproperties">Configuring properties</h3><p>Each login module 
supports the following additional set of properties:</p><div 
class="table-wrap"><table class="confluenceTable"><tr><th class="confluenceTh"> 
Name                   </th><th class="confluenceTh"> Description 
</th></tr><tr><td class="confluenceTd"> <tt>encryption.name</tt>      </td><td 
class="confluenceTd"> Name of the encryption service registered in OSGi (cf. 
paragraph <a href="#Ja
 sypt.html">below</a>) </td></tr><tr><td class="confluenceTd"> 
<tt>encryption.enabled</tt>   </td><td class="confluenceTd"> Boolean used to 
turn on encryption </td></tr><tr><td class="confluenceTd"> 
<tt>encryption.prefix</tt>    </td><td class="confluenceTd"> Prefix for 
encrypted passwords </td></tr><tr><td class="confluenceTd"> 
<tt>encryption.suffix</tt>    </td><td class="confluenceTd"> Suffix for 
encrypted passwords </td></tr><tr><td class="confluenceTd"> 
<tt>encryption.algorithm</tt> </td><td class="confluenceTd"> Name of an 
algorithm to be used for hashing, like "MD5" or "SHA-1" </td></tr><tr><td 
class="confluenceTd"> <tt>encryption.encoding</tt>  </td><td 
class="confluenceTd"> Encrypted passwords encoding (can be <tt>hexadecimal</tt> 
or <tt>base64</tt>) </td></tr><tr><td class="confluenceTd"> 
<tt>role.policy</tt>          </td><td class="confluenceTd"> A policy for 
identifying roles (can be <tt>prefix</tt> or <tt>group</tt>) <a 
href="#Rolediscoverypolicies.html">below</a>) </td
 ></tr><tr><td class="confluenceTd"> <tt>role.discriminator</tt>   </td><td 
 >class="confluenceTd"> A discriminator value to be used by the role policy 
 ></td></tr></table></div><p>A simple example follows:</p><div 
 >class="syntax"><div class="highlight"><pre><span 
 >class="nt">&lt;jaas:config</span> <span class="na">name=</span><span 
 >class="s">&quot;karaf&quot;</span><span class="nt">&gt;</span>&#x000A;    
 ><span class="nt">&lt;jaas:module</span> <span 
 >class="na">className=</span><span 
 >class="s">&quot;org.apache.karaf.jaas.modules.properties.PropertiesLoginModule&quot;</span>
 > &#x000A;                 <span class="na">flags=</span><span 
 >class="s">&quot;required&quot;</span><span class="nt">&gt;</span>&#x000A;     
 >   users = $[karaf.base]/etc/users.properties&#x000A;        
 >encryption.enabled = true&#x000A;        encryption.algorithm = MD5&#x000A;   
 >     encryption.encoding = hexadecimal&#x000A;    <span 
 >class="nt">&lt;/jaas:module&gt;</span>&#x000A;<span 
 >class="nt">&lt;/jaas:config&gt;</span
 >&#x000A;</pre></div>&#x000A;</div><h3 id="Prefixandsuffix">Prefix and 
 >suffix</h3><p>The login modules have the ability to support both encrypted 
 >and plain passwords at the same time.  In some cases, some login modules may 
 >be able to encrypt the passwords on the fly and save them back in an 
 >encrypted form.</p><h3 id="Jasypt">Jasypt</h3><p>Karaf default installation 
 >comes with a simple encryption service which usually fulfills simple needs.  
 >However, in some cases, you may need to install the <a 
 >href="http://www.jasypt.org/";>Jasypt</a> library which provides stronger 
 >encryption algorithms and more control over them.</p><p>To install the Jasypt 
 >library, the easiest way is to install the available feature:</p><pre>
 karaf@root> features:install jasypt-encryption
-</pre><p>It will download and install the required bundles and also register 
an <tt>EncryptionService</tt> for Jasypt in the OSGi registry.</p><p>When 
configuring a login module to use Jasypt, you need to specify the 
<tt>encryption.name</tt> property and set it to a value of <tt>jasypt</tt> to 
make sure the Jasypt encryption service will be used. </p><p>In addition to the 
standard properties above, the Jasypt service provides the following 
parameters:</p><div class="table-wrap"><table class="confluenceTable"><tr><th 
class="confluenceTh"> Name                     </th><th class="confluenceTh"> 
Description </th></tr><tr><td class="confluenceTd"> <tt>providerName</tt>       
    </td><td class="confluenceTd"> Name of the <tt>java.security.Provider</tt> 
name to use for obtaining the digest algorithm </td></tr><tr><td 
class="confluenceTd"> <tt>providerClassName</tt>      </td><td 
class="confluenceTd"> Class name for the security provider to be used for 
obtaining the digest algorithm </td>
 </tr><tr><td class="confluenceTd"> <tt>iterations</tt>             </td><td 
class="confluenceTd"> Number of times the hash function will be applied 
recursively </td></tr><tr><td class="confluenceTd"> <tt>saltSizeBytes</tt>      
    </td><td class="confluenceTd"> Size of the salt to be used to compute the 
digest </td></tr><tr><td class="confluenceTd"> <tt>saltGeneratorClassName</tt> 
</td><td class="confluenceTd"> Class name of the salt generator 
</td></tr></table></div><p>A typical realm definition using Jasypt encryption 
service would look like:</p><div class="syntax"><pre name='code' class='brush: 
xml; gutter: false;'><code>
-&lt;jaas:config name=&quot;karaf&quot;&gt;
-    &lt;jaas:module 
className=&quot;org.apache.karaf.jaas.modules.properties.PropertiesLoginModule&quot;
 
-                 flags=&quot;required&quot;&gt;
-        users = $[karaf.base]/etc/users.properties
-        encryption.enabled = true
-        encryption.name = jasypt
-        encryption.algorithm = SHA-256
-        encryption.encoding = base64
-        encryption.iterations = 100000
-        encryption.saltSizeBytes = 16
-    &lt;/jaas:module&gt;
-&lt;/jaas:config&gt;</code></pre></div><h2 id="Rolediscoverypolicies">Role 
discovery policies</h2><p>The JAAS specification does not provide means to 
distinguish between User and Role Principals without referring to the 
specification classes. In order to provide means to the application developer 
to decouple the application from Karaf JAAS implementation role policies have 
been created.</p><p>A role policy is a convention that can be adopted by the 
application in order to identify Roles, without depending from the 
implementation. Each role policy can be cofigured by setting a "role.policy" 
and "role.discriminator" property to the login module configuration. Currently, 
Karaf provides two policies that can be applied to all Karaf Login 
Modules.</p><ol><li>Prefixed Roles</li><li>Grouped 
Roles</li></ol><p><u>Prefixed Roles</u><br/>When the prefixed role policy is 
used the login module applies a configurable prefix <em>(property 
role.discriminator)</em> to the role, so that the applicati
 on can identify the role's principals by its prefix. Example:</p><div 
class="syntax"><pre name='code' class='brush: xml; gutter: false;'><code>
-&lt;jaas:config name=&quot;karaf&quot;&gt;
-    &lt;jaas:module 
className=&quot;org.apache.karaf.jaas.modules.properties.PropertiesLoginModule&quot;
 
-                 flags=&quot;required&quot;&gt;
-        users = $[karaf.base]/etc/users.properties
-        role.policy = prefix
-        role.discriminator = ROLE_
-    &lt;/jaas:module&gt;
-&lt;/jaas:config&gt;</code></pre></div><p>The application can identify the 
role principals using a snippet like this:</p><div class="syntax"><pre 
name='code' class='brush: java; gutter: false;'><code>
-LoginContext ctx = new LoginContext(&quot;karaf&quot;, handler);
-ctx.login();
-authenticated = true;
-subject = ctx.getSubject();
-for (Principal p : subject.getPrincipals()) {
-       if (p.getName().startsWith(&quot;ROLE_&quot;)) {
-               roles.add((p.getName().substring(&quot;ROLE_&quot;.length())));
-       }
-}</code></pre></div><p><u>Grouped Roles</u><br/>When the group role policy is 
used the login module provides all roles as members of a group with a 
configurable name <em>(property role.discriminator)</em>. Example:</p><div 
class="syntax"><pre name='code' class='brush: xml; gutter: false;'><code>
-&lt;jaas:config name=&quot;karaf&quot;&gt;
-    &lt;jaas:module 
className=&quot;org.apache.karaf.jaas.modules.properties.PropertiesLoginModule&quot;
 
-                 flags=&quot;required&quot;&gt;
-        users = $[karaf.base]/etc/users.properties
-        role.policy = group
-        role.discriminator = ROLES
-    &lt;/jaas:module&gt;
-&lt;/jaas:config&gt;</code></pre></div><div class="syntax"><pre name='code' 
class='brush: java; gutter: false;'><code>
-LoginContext ctx = new LoginContext(&quot;karaf&quot;, handler);
-ctx.login();
-authenticated = true;
-subject = ctx.getSubject();
-for (Principal p : subject.getPrincipals()) {
-    if ((p instanceof Group) &amp;&amp; 
(&quot;ROLES&quot;.equalsIgnoreCase(p.getName()))) {
-        Group g = (Group) p;
-        Enumeration&lt;? extends Principal&gt; members = g.members();
-        while (members.hasMoreElements()) {
-            Principal member = members.nextElement();
-            roles.add(member.getName());
-        }
-    }
-}</code></pre></div><h2 id="Defaultrolepolicies">Default role 
policies</h2><p>The previous section describes how to leverage role policies. 
However, Karaf provides a default role policy, based on the following class 
names:</p><ul><li>org.apache.karaf.jaas.modules.UserPrincipal</li><li>org.apache.karaf.jaas.modules.RolePrincipal</li><li>org.apache.karaf.jaas.modules.GroupPrincipal</li></ul><p>It
 allows you to directly handling the role class:</p><div class="syntax"><pre 
name='code' class='brush: java; gutter: false;'><code>
-String rolePrincipalClass = 
&quot;org.apache.karaf.jaas.modules.RolePrincipal&quot;;
-
-for (Principal p : subject.getPrincipals()) {
-       if (p.getClass().getName().equals(rolePrincipalClass)) {
-               roles.add(p.getName());
-       }
-}</code></pre></div>
+</pre><p>It will download and install the required bundles and also register 
an <tt>EncryptionService</tt> for Jasypt in the OSGi registry.</p><p>When 
configuring a login module to use Jasypt, you need to specify the 
<tt>encryption.name</tt> property and set it to a value of <tt>jasypt</tt> to 
make sure the Jasypt encryption service will be used. </p><p>In addition to the 
standard properties above, the Jasypt service provides the following 
parameters:</p><div class="table-wrap"><table class="confluenceTable"><tr><th 
class="confluenceTh"> Name                     </th><th class="confluenceTh"> 
Description </th></tr><tr><td class="confluenceTd"> <tt>providerName</tt>       
    </td><td class="confluenceTd"> Name of the <tt>java.security.Provider</tt> 
name to use for obtaining the digest algorithm </td></tr><tr><td 
class="confluenceTd"> <tt>providerClassName</tt>      </td><td 
class="confluenceTd"> Class name for the security provider to be used for 
obtaining the digest algorithm </td>
 </tr><tr><td class="confluenceTd"> <tt>iterations</tt>             </td><td 
class="confluenceTd"> Number of times the hash function will be applied 
recursively </td></tr><tr><td class="confluenceTd"> <tt>saltSizeBytes</tt>      
    </td><td class="confluenceTd"> Size of the salt to be used to compute the 
digest </td></tr><tr><td class="confluenceTd"> <tt>saltGeneratorClassName</tt> 
</td><td class="confluenceTd"> Class name of the salt generator 
</td></tr></table></div><p>A typical realm definition using Jasypt encryption 
service would look like:</p><div class="syntax"><div 
class="highlight"><pre><span class="nt">&lt;jaas:config</span> <span 
class="na">name=</span><span class="s">&quot;karaf&quot;</span><span 
class="nt">&gt;</span>&#x000A;    <span class="nt">&lt;jaas:module</span> <span 
class="na">className=</span><span 
class="s">&quot;org.apache.karaf.jaas.modules.properties.PropertiesLoginModule&quot;</span>
 &#x000A;                 <span class="na">flags=</span><span class="s">&q
 uot;required&quot;</span><span class="nt">&gt;</span>&#x000A;        users = 
$[karaf.base]/etc/users.properties&#x000A;        encryption.enabled = 
true&#x000A;        encryption.name = jasypt&#x000A;        
encryption.algorithm = SHA-256&#x000A;        encryption.encoding = 
base64&#x000A;        encryption.iterations = 100000&#x000A;        
encryption.saltSizeBytes = 16&#x000A;    <span 
class="nt">&lt;/jaas:module&gt;</span>&#x000A;<span 
class="nt">&lt;/jaas:config&gt;</span>&#x000A;</pre></div>&#x000A;</div><h2 
id="Rolediscoverypolicies">Role discovery policies</h2><p>The JAAS 
specification does not provide means to distinguish between User and Role 
Principals without referring to the specification classes. In order to provide 
means to the application developer to decouple the application from Karaf JAAS 
implementation role policies have been created.</p><p>A role policy is a 
convention that can be adopted by the application in order to identify Roles, 
without depending from the i
 mplementation. Each role policy can be cofigured by setting a "role.policy" 
and "role.discriminator" property to the login module configuration. Currently, 
Karaf provides two policies that can be applied to all Karaf Login 
Modules.</p><ol><li>Prefixed Roles</li><li>Grouped 
Roles</li></ol><p><u>Prefixed Roles</u><br/>When the prefixed role policy is 
used the login module applies a configurable prefix <em>(property 
role.discriminator)</em> to the role, so that the application can identify the 
role's principals by its prefix. Example:</p><div class="syntax"><div 
class="highlight"><pre><span class="nt">&lt;jaas:config</span> <span 
class="na">name=</span><span class="s">&quot;karaf&quot;</span><span 
class="nt">&gt;</span>&#x000A;    <span class="nt">&lt;jaas:module</span> <span 
class="na">className=</span><span 
class="s">&quot;org.apache.karaf.jaas.modules.properties.PropertiesLoginModule&quot;</span>
 &#x000A;                 <span class="na">flags=</span><span 
class="s">&quot;required&q
 uot;</span><span class="nt">&gt;</span>&#x000A;        users = 
$[karaf.base]/etc/users.properties&#x000A;        role.policy = prefix&#x000A;  
      role.discriminator = ROLE_&#x000A;    <span 
class="nt">&lt;/jaas:module&gt;</span>&#x000A;<span 
class="nt">&lt;/jaas:config&gt;</span>&#x000A;</pre></div>&#x000A;</div><p>The 
application can identify the role principals using a snippet like this:</p><div 
class="syntax"><div class="highlight"><pre><span class="n">LoginContext</span> 
<span class="n">ctx</span> <span class="o">=</span> <span class="k">new</span> 
<span class="n">LoginContext</span><span class="o">(</span><span 
class="s">&quot;karaf&quot;</span><span class="o">,</span> <span 
class="n">handler</span><span class="o">);</span>&#x000A;<span 
class="n">ctx</span><span class="o">.</span><span class="na">login</span><span 
class="o">();</span>&#x000A;<span class="n">authenticated</span> <span 
class="o">=</span> <span class="kc">true</span><span 
class="o">;</span>&#x000A;<span class="
 n">subject</span> <span class="o">=</span> <span class="n">ctx</span><span 
class="o">.</span><span class="na">getSubject</span><span 
class="o">();</span>&#x000A;<span class="k">for</span> <span 
class="o">(</span><span class="n">Principal</span> <span class="n">p</span> 
<span class="o">:</span> <span class="n">subject</span><span 
class="o">.</span><span class="na">getPrincipals</span><span 
class="o">())</span> <span class="o">{</span>&#x000A;          <span 
class="k">if</span> <span class="o">(</span><span class="n">p</span><span 
class="o">.</span><span class="na">getName</span><span 
class="o">().</span><span class="na">startsWith</span><span 
class="o">(</span><span class="s">&quot;ROLE_&quot;</span><span 
class="o">))</span> <span class="o">{</span>&#x000A;                 <span 
class="n">roles</span><span class="o">.</span><span class="na">add</span><span 
class="o">((</span><span class="n">p</span><span class="o">.</span><span 
class="na">getName</span><span class="o">().</span><span class="na">sub
 string</span><span class="o">(</span><span 
class="s">&quot;ROLE_&quot;</span><span class="o">.</span><span 
class="na">length</span><span class="o">())));</span>&#x000A;       <span 
class="o">}</span>&#x000A;<span 
class="o">}</span>&#x000A;</pre></div>&#x000A;</div><p><u>Grouped 
Roles</u><br/>When the group role policy is used the login module provides all 
roles as members of a group with a configurable name <em>(property 
role.discriminator)</em>. Example:</p><div class="syntax"><div 
class="highlight"><pre><span class="nt">&lt;jaas:config</span> <span 
class="na">name=</span><span class="s">&quot;karaf&quot;</span><span 
class="nt">&gt;</span>&#x000A;    <span class="nt">&lt;jaas:module</span> <span 
class="na">className=</span><span 
class="s">&quot;org.apache.karaf.jaas.modules.properties.PropertiesLoginModule&quot;</span>
 &#x000A;                 <span class="na">flags=</span><span 
class="s">&quot;required&quot;</span><span class="nt">&gt;</span>&#x000A;       
 users = $[karaf.base]/etc/
 users.properties&#x000A;        role.policy = group&#x000A;        
role.discriminator = ROLES&#x000A;    <span 
class="nt">&lt;/jaas:module&gt;</span>&#x000A;<span 
class="nt">&lt;/jaas:config&gt;</span>&#x000A;</pre></div>&#x000A;</div><div 
class="syntax"><div class="highlight"><pre><span class="n">LoginContext</span> 
<span class="n">ctx</span> <span class="o">=</span> <span class="k">new</span> 
<span class="n">LoginContext</span><span class="o">(</span><span 
class="s">&quot;karaf&quot;</span><span class="o">,</span> <span 
class="n">handler</span><span class="o">);</span>&#x000A;<span 
class="n">ctx</span><span class="o">.</span><span class="na">login</span><span 
class="o">();</span>&#x000A;<span class="n">authenticated</span> <span 
class="o">=</span> <span class="kc">true</span><span 
class="o">;</span>&#x000A;<span class="n">subject</span> <span 
class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span 
class="na">getSubject</span><span class="o">();</span>&#x000A;<sp
 an class="k">for</span> <span class="o">(</span><span 
class="n">Principal</span> <span class="n">p</span> <span class="o">:</span> 
<span class="n">subject</span><span class="o">.</span><span 
class="na">getPrincipals</span><span class="o">())</span> <span 
class="o">{</span>&#x000A;    <span class="k">if</span> <span 
class="o">((</span><span class="n">p</span> <span class="k">instanceof</span> 
<span class="n">Group</span><span class="o">)</span> <span 
class="o">&amp;&amp;</span> <span class="o">(</span><span 
class="s">&quot;ROLES&quot;</span><span class="o">.</span><span 
class="na">equalsIgnoreCase</span><span class="o">(</span><span 
class="n">p</span><span class="o">.</span><span class="na">getName</span><span 
class="o">())))</span> <span class="o">{</span>&#x000A;        <span 
class="n">Group</span> <span class="n">g</span> <span class="o">=</span> <span 
class="o">(</span><span class="n">Group</span><span class="o">)</span> <span 
class="n">p</span><span class="o">;</span>&#x000A;   
      <span class="n">Enumeration</span><span class="o">&lt;?</span> <span 
class="kd">extends</span> <span class="n">Principal</span><span 
class="o">&gt;</span> <span class="n">members</span> <span class="o">=</span> 
<span class="n">g</span><span class="o">.</span><span 
class="na">members</span><span class="o">();</span>&#x000A;        <span 
class="k">while</span> <span class="o">(</span><span 
class="n">members</span><span class="o">.</span><span 
class="na">hasMoreElements</span><span class="o">())</span> <span 
class="o">{</span>&#x000A;            <span class="n">Principal</span> <span 
class="n">member</span> <span class="o">=</span> <span 
class="n">members</span><span class="o">.</span><span 
class="na">nextElement</span><span class="o">();</span>&#x000A;            
<span class="n">roles</span><span class="o">.</span><span 
class="na">add</span><span class="o">(</span><span class="n">member</span><span 
class="o">.</span><span class="na">getName</span><span 
class="o">());</span>&#x000
 A;        <span class="o">}</span>&#x000A;    <span 
class="o">}</span>&#x000A;<span 
class="o">}</span>&#x000A;</pre></div>&#x000A;</div><h2 
id="Defaultrolepolicies">Default role policies</h2><p>The previous section 
describes how to leverage role policies. However, Karaf provides a default role 
policy, based on the following class 
names:</p><ul><li>org.apache.karaf.jaas.modules.UserPrincipal</li><li>org.apache.karaf.jaas.modules.RolePrincipal</li><li>org.apache.karaf.jaas.modules.GroupPrincipal</li></ul><p>It
 allows you to directly handling the role class:</p><div class="syntax"><div 
class="highlight"><pre><span class="n">String</span> <span 
class="n">rolePrincipalClass</span> <span class="o">=</span> <span 
class="s">&quot;org.apache.karaf.jaas.modules.RolePrincipal&quot;</span><span 
class="o">;</span>&#x000A;&#x000A;<span class="k">for</span> <span 
class="o">(</span><span class="n">Principal</span> <span class="n">p</span> 
<span class="o">:</span> <span class="n">subject</span><span
  class="o">.</span><span class="na">getPrincipals</span><span 
class="o">())</span> <span class="o">{</span>&#x000A;    <span 
class="k">if</span> <span class="o">(</span><span class="n">p</span><span 
class="o">.</span><span class="na">getClass</span><span 
class="o">().</span><span class="na">getName</span><span 
class="o">().</span><span class="na">equals</span><span class="o">(</span><span 
class="n">rolePrincipalClass</span><span class="o">))</span> <span 
class="o">{</span>&#x000A;          <span class="n">roles</span><span 
class="o">.</span><span class="na">add</span><span class="o">(</span><span 
class="n">p</span><span class="o">.</span><span class="na">getName</span><span 
class="o">());</span>&#x000A;       <span class="o">}</span>&#x000A;<span 
class="o">}</span>&#x000A;</pre></div>&#x000A;</div>
                 </div>
               </td>
             </tr>

Modified: 
karaf/site/production/manual/latest-2.3.x/developers-guide/shell-syntax.html
URL: 
http://svn.apache.org/viewvc/karaf/site/production/manual/latest-2.3.x/developers-guide/shell-syntax.html?rev=1615948&r1=1615947&r2=1615948&view=diff
==============================================================================
--- 
karaf/site/production/manual/latest-2.3.x/developers-guide/shell-syntax.html 
(original)
+++ 
karaf/site/production/manual/latest-2.3.x/developers-guide/shell-syntax.html 
Tue Aug  5 15:46:54 2014
@@ -8,7 +8,7 @@
     <link href="../css/style.css" rel="stylesheet" type="text/css"/>
     <link href="../css/pygmentize.css" rel="stylesheet" type="text/css"/>
     <title>
-      Apache Karaf 2.3.2 Guides
+      Apache Karaf 2.3.7-SNAPSHOT Guides
     </title>
   </head>
   <body>


Reply via email to