Add default LSprofiles with the name of authenticable object types

Consquently adjust LSaccessRigthsMatrixView addon and make some 
representative change in LSexample for demo
This commit is contained in:
Benjamin Renard 2020-05-25 11:09:32 +02:00
parent cf1a98e4b3
commit d68b15bac3
5 changed files with 102 additions and 44 deletions

View file

@ -2,16 +2,56 @@
<!-- Début LSprofiles --> <!-- Début LSprofiles -->
<sect4 id='config-LSprofile'> <sect4 id='config-LSprofile'>
<title>Profils d'utilisateurs</title> <title>Profils d'utilisateurs</title>
<para>Cette section décrit la manière dont sont définis les profils d'utilisateurs <para>Cette section décrit la manière dont sont définis les profils d'utilisateurs
se connectant à l'interface appelés <emphasis>LSprofile</emphasis>. Il est se connectant à l'interface appelés <emphasis>LSprofile</emphasis>. Il est possible
possible de définir autant de profils d'utilisateurs que l'on souhaite. Pour d'attribuer un profil à l'utilisateur connecté sur tout ou partie de l'annuaire LDAP.
chaque profil d'utilisateur, il faudra définir dans quelles parties de </para>
l'annuaire ce profil existe (Exemple : les admistrateurs de groupes existent
uniquement dans la branche de l'annuaire stockant les groupes). Enfin pour <sect5 id='config-LSprofile-default'>
chaque partie de l'annuaire, il faudra définir la manière d'identifier si <title>Profils d'utilisateurs par défaut</title>
l'utilisateur qui se connecte appartient à ce profil.</para> <para>Il existe des profils d'utilisateurs par défaut, non liée à la configuration de
l'application:
<variablelist>
<varlistentry>
<term>user</term>
<listitem>
<simpara>Tous les utilisateurs connectés à l'utilisateur. Ce &LSprofile; est valide sur l'ensemble de l'annuaire.</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>self</term>
<listitem>
<simpara>L'utilisateur connecté sur son objet correspondant dans l'annuaire. Ce &LSprofile; est utile pour donner des
droits à l'utilisateur sur lui-même.</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>nom du type de l'objet connecté</term>
<listitem>
<simpara>Un &LSprofile; du nom du type d'objet utilisateur connecté est automatiquement ajouté à l'utilisateur.
Ainsi, si l'utilisateur connecté est un &LSobject; <literal>LSpeople</literal> par exemple, il aura le &LSprofile;
<literal>LSpeople</literal> sur tous l'annuaire. Ce &LSprofile; est utile pour donner des droits à tous un type
d'objets pouvant se connecter à l'application (par exemple, tous les utilisateurs applicatifs).</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
</sect5>
<sect5 id='config-LSprofile-custom'>
<title>Profils d'utilisateurs personalisés</title>
<para>Il est possible de définir autant de profils d'utilisateurs que l'on souhaite. Pour chaque profil
d'utilisateur personnalisé, il faudra définir dans quelles parties de l'annuaire ce profil existe (Exemple :
les admistrateurs de groupes existent uniquement dans la branche de l'annuaire stockant les groupes). Enfin
pour chaque partie de l'annuaire, il faudra définir la manière d'identifier si l'utilisateur qui se connecte
appartient à ce profil.</para>
<programlisting linenumbering="unnumbered"> <programlisting linenumbering="unnumbered">
<citetitle>Structure</citetitle>... <citetitle>Structure</citetitle>...
<![CDATA['LSprofile' => array ( <![CDATA['LSprofile' => array (
@ -27,12 +67,12 @@
) )
), ),
'LSobjects' => array ( // via une liste d'objet sur lequel l'utilisateur a des pouvoirs 'LSobjects' => array ( // via une liste d'objet sur lequel l'utilisateur a des pouvoirs
[nom du LSobject] => array ( [nom du LSobject] => array (
'attr' => [nom de l'attribut clé], 'attr' => [nom de l'attribut clé],
'attr_value' => [format de la valeur de l'attribut clé], 'attr_value' => [format de la valeur de l'attribut clé],
// ou // ou
'filter' => [format du filtre de recherche], 'filter' => [format du filtre de recherche],
'basedn' => [basedn de recherche], 'basedn' => [basedn de recherche],
'params' => [configuration de la recherche] 'params' => [configuration de la recherche]
), ),
@ -56,7 +96,7 @@
... ...
),]]> ),]]>
... ...
</programlisting> </programlisting>
<para> <para>
Le paramètre <varname>LSprofiles</varname> est un tableau associatif contenant, Le paramètre <varname>LSprofiles</varname> est un tableau associatif contenant,
@ -66,7 +106,7 @@ la configuration nécessaire pour déterminer si l'utilisateur connecté apparti
</para> </para>
<para> <para>
Dans chaque configuration de <emphasis>LSprofile</emphasis>, il est possible Dans chaque configuration de <emphasis>LSprofile</emphasis>, il est possible
d'identifier l'appartenance ou non de l'utilisateur connecté de deux manières&nbsp;: d'identifier l'appartenance ou non de l'utilisateur connecté de deux manières&nbsp;:
</para> </para>
@ -74,9 +114,9 @@ d'identifier l'appartenance ou non de l'utilisateur connecté de deux manières&
<!-- D - Pour basedn --> <!-- D - Pour basedn -->
<listitem> <listitem>
<para>Pour une branche de l'annuaire donnée (<emphasis>basedn</emphasis>)&nbsp;: <para>Pour une branche de l'annuaire donnée (<emphasis>basedn</emphasis>)&nbsp;:
en listant les utilisateurs appartenant à ce <emphasis>LSprofile</emphasis> pour en listant les utilisateurs appartenant à ce <emphasis>LSprofile</emphasis> pour
tous les objets de la branche. Il sera possible de lister les utilisateurs dont tous les objets de la branche. Il sera possible de lister les utilisateurs dont
on connait le <emphasis>DN</emphasis> ou de lister les utilisateurs appartenant on connait le <emphasis>DN</emphasis> ou de lister les utilisateurs appartenant
à une liste stockée dans l'annuaire (par exemple la liste des membres d'un à une liste stockée dans l'annuaire (par exemple la liste des membres d'un
groupe).</para> groupe).</para>
@ -103,12 +143,12 @@ groupe).</para>
),]]> ),]]>
... ...
</programlisting> </programlisting>
<simpara>Explication&nbsp;: Pour un <emphasis>LSprofile</emphasis> et un <simpara>Explication&nbsp;: Pour un <emphasis>LSprofile</emphasis> et un
<emphasis>basedn</emphasis> donnés, on définit l'utilisateur appartenant au <emphasis>basedn</emphasis> donnés, on définit l'utilisateur appartenant au
<emphasis>LSprofile</emphasis> en donnant son <emphasis>DN</emphasis>. Si on <emphasis>LSprofile</emphasis> en donnant son <emphasis>DN</emphasis>. Si on
souhaite lister plusieurs utilisateurs, on utilise un tableau associatif dans souhaite lister plusieurs utilisateurs, on utilise un tableau associatif dans
lequel les clés sont les <emphasis>DNs</emphasis> des utilisateurs et les valeurs lequel les clés sont les <emphasis>DNs</emphasis> des utilisateurs et les valeurs
associées sont toutes <emphasis>NULL</emphasis>.</simpara> associées sont toutes <emphasis>NULL</emphasis>.</simpara>
</listitem> </listitem>
<!-- F - Liste de DNs --> <!-- F - Liste de DNs -->
@ -130,10 +170,10 @@ associées sont toutes <emphasis>NULL</emphasis>.</simpara>
),]]> ),]]>
... ...
</programlisting> </programlisting>
<simpara>Explication&nbsp;: Pour un <emphasis>LSprofile</emphasis> et un <simpara>Explication&nbsp;: Pour un <emphasis>LSprofile</emphasis> et un
<emphasis>basedn</emphasis> donnés, on liste les utilisateurs du <emphasis>basedn</emphasis> donnés, on liste les utilisateurs du
<emphasis>LSprofile</emphasis> référencés dans l'attribut <varname>attr</varname> <emphasis>LSprofile</emphasis> référencés dans l'attribut <varname>attr</varname>
de l'object de type <varname>LSobject</varname> et selon le format de valeur de l'object de type <varname>LSobject</varname> et selon le format de valeur
décrit dans <varname>attr_value</varname>.</simpara> décrit dans <varname>attr_value</varname>.</simpara>
</listitem> </listitem>
<!-- F - Liste stocké --> <!-- F - Liste stocké -->
@ -148,8 +188,8 @@ décrit dans <varname>attr_value</varname>.</simpara>
<listitem> <listitem>
<simpara>Pour un type de <emphasis>LSobject</emphasis> donné&nbsp;: en listant <simpara>Pour un type de <emphasis>LSobject</emphasis> donné&nbsp;: en listant
les objets pour lesquels l'utilisateur aura les droits du LSprofile. Il sera les objets pour lesquels l'utilisateur aura les droits du LSprofile. Il sera
possible, à travers une recherche paramétrable dans l'annuaire, de lister les possible, à travers une recherche paramétrable dans l'annuaire, de lister les
objets pour lesquels l'utilisateur appartiendra au objets pour lesquels l'utilisateur appartiendra au
<emphasis>LSprofile</emphasis>.</simpara> <emphasis>LSprofile</emphasis>.</simpara>
<programlisting linenumbering="unnumbered"> <programlisting linenumbering="unnumbered">
<citetitle>Structure</citetitle>... <citetitle>Structure</citetitle>...
@ -157,12 +197,12 @@ objets pour lesquels l'utilisateur appartiendra au
[nom d'un LSprofile] => array ( [nom d'un LSprofile] => array (
'LSobjects' => array ( // via un liste d'objet pour lequel l'utilisateur 'LSobjects' => array ( // via un liste d'objet pour lequel l'utilisateur
// appartient au LSprofile // appartient au LSprofile
[nom du LSobject] => array ( [nom du LSobject] => array (
'attr' => [nom de l'attribut clé], 'attr' => [nom de l'attribut clé],
'attr_value' => [format de la valeur de l'attribut clé], 'attr_value' => [format de la valeur de l'attribut clé],
// or // or
'filter' => [format du filtre de recherche], 'filter' => [format du filtre de recherche],
'basedn' => [basedn de recherche], 'basedn' => [basedn de recherche],
'params' => [configuration de la recherche] 'params' => [configuration de la recherche]
), ),
@ -186,7 +226,7 @@ objets pour lesquels l'utilisateur appartiendra au
... ...
),]]> ),]]>
... ...
</programlisting> </programlisting>
<para>Explications&nbsp;: Dans la configuration d'un <emphasis>LSprofile</emphasis>, <para>Explications&nbsp;: Dans la configuration d'un <emphasis>LSprofile</emphasis>,
la valeur clé <emphasis>LSobjects</emphasis> signifie qu'on est dans un cas de la la valeur clé <emphasis>LSobjects</emphasis> signifie qu'on est dans un cas de la
délégation de droits sur des types d'LSobject. Dans ce tableau associatif, il délégation de droits sur des types d'LSobject. Dans ce tableau associatif, il
@ -228,7 +268,7 @@ objets retournés. Les paramètres de la recherche sont&nbsp;:
<varlistentry> <varlistentry>
<term>attr</term> <term>attr</term>
<listitem> <listitem>
<simpara>Nom de l'attribut des LSobjets contenant une valeur clé qui <simpara>Nom de l'attribut des LSobjets contenant une valeur clé qui
permettra d'identifier l'utilisateur comme ayant droit.</simpara> permettra d'identifier l'utilisateur comme ayant droit.</simpara>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -238,7 +278,7 @@ objets retournés. Les paramètres de la recherche sont&nbsp;:
<listitem> <listitem>
<simpara>Le format de la valeur clé prise par l'attribut <varname>attr</varname>. <simpara>Le format de la valeur clé prise par l'attribut <varname>attr</varname>.
Ce format est composé à partir des données de l'objet de l'utilisateur Ce format est composé à partir des données de l'objet de l'utilisateur
connecté. Voir le paragraphe <link linkend="config-LSformat">Format connecté. Voir le paragraphe <link linkend="config-LSformat">Format
paramètrable</link> pour plus d'informations sur l'écriture du format.</simpara> paramètrable</link> pour plus d'informations sur l'écriture du format.</simpara>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -246,9 +286,9 @@ objets retournés. Les paramètres de la recherche sont&nbsp;:
<varlistentry> <varlistentry>
<term>filter</term> <term>filter</term>
<listitem> <listitem>
<simpara>Ce paramètre remplace les paramètres <varname>attr</varname> et <simpara>Ce paramètre remplace les paramètres <varname>attr</varname> et
<varname>attr_value</varname>. Il est possible ici d'écrire directement le <varname>attr_value</varname>. Il est possible ici d'écrire directement le
format paramètrable du filtre recherche dans l'annuaire. Ce filtre sera format paramètrable du filtre recherche dans l'annuaire. Ce filtre sera
automatiquement agrémenté des conditions sur l'attribut <emphasis>objectclass</emphasis>. automatiquement agrémenté des conditions sur l'attribut <emphasis>objectclass</emphasis>.
Voir le paragraphe <link linkend="config-LSformat">Format paramètrable</link> Voir le paragraphe <link linkend="config-LSformat">Format paramètrable</link>
pour plus d'informations sur l'écriture du format.</simpara> pour plus d'informations sur l'écriture du format.</simpara>
@ -259,7 +299,7 @@ objets retournés. Les paramètres de la recherche sont&nbsp;:
<term>basedn</term> <term>basedn</term>
<listitem> <listitem>
<simpara>C'est le <emphasis>basedn</emphasis> de la recherche. Il est possible <simpara>C'est le <emphasis>basedn</emphasis> de la recherche. Il est possible
ainsi de la limiter sur les LSojects d'une branche précise de l'annuaire. ainsi de la limiter sur les LSojects d'une branche précise de l'annuaire.
<emphasis>(Paramètre facultatif)</emphasis></simpara> <emphasis>(Paramètre facultatif)</emphasis></simpara>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -267,7 +307,7 @@ objets retournés. Les paramètres de la recherche sont&nbsp;:
<varlistentry> <varlistentry>
<term>params</term> <term>params</term>
<listitem> <listitem>
<simpara>C'est un tableau associatif contenant les paramètres étendus de la <simpara>C'est un tableau associatif contenant les paramètres étendus de la
recherche. Voir le paragraphe <link linkend="config-search-params"> recherche. Voir le paragraphe <link linkend="config-search-params">
Paramètres étendus des recherches dans l'annuaire</link> pour plus de détails. Paramètres étendus des recherches dans l'annuaire</link> pour plus de détails.
<emphasis>(Paramètre facultatif)</emphasis></simpara> <emphasis>(Paramètre facultatif)</emphasis></simpara>
@ -287,6 +327,8 @@ objets retournés. Les paramètres de la recherche sont&nbsp;:
<emphasis>LSprofile</emphasis> à l'aide de la clé <literal>label</literal>. Ce <emphasis>LSprofile</emphasis> à l'aide de la clé <literal>label</literal>. Ce
label sera utilisé pour faire référence au <emphasis>LSprofile</emphasis> lorsque label sera utilisé pour faire référence au <emphasis>LSprofile</emphasis> lorsque
nécéssaire. <emphasis>(Paramètre facultatif)</emphasis></para> nécéssaire. <emphasis>(Paramètre facultatif)</emphasis></para>
</sect5>
</sect4> </sect4>
<!-- Fin LSprofiles --> <!-- Fin LSprofiles -->

View file

@ -48,7 +48,8 @@ $GLOBALS['LSobjects']['LSsysaccount'] = array (
'linkAttributeValue' => "dn", 'linkAttributeValue' => "dn",
'rights' => array( 'rights' => array(
'admin' => 'w', 'admin' => 'w',
'admingroup' => 'w' 'admingroup' => 'w',
'LSsysaccount' => 'r',
), ),
), ),
), ),
@ -78,6 +79,7 @@ $GLOBALS['LSobjects']['LSsysaccount'] = array (
), ),
'rights' => array( 'rights' => array(
'self' => 'r', 'self' => 'r',
'LSsysaccount' => 'r',
'admin' => 'w', 'admin' => 'w',
), ),
'view' => 1, 'view' => 1,
@ -139,6 +141,7 @@ $GLOBALS['LSobjects']['LSsysaccount'] = array (
'multiple' => 1, 'multiple' => 1,
'rights' => array( 'rights' => array(
'self' => 'r', 'self' => 'r',
'LSsysaccount' => 'r',
'admin' => 'w', 'admin' => 'w',
), ),
'view' => 1, 'view' => 1,

View file

@ -24,5 +24,6 @@ $GLOBALS['LSaddons']['loads'] = array (
'samba', 'samba',
'posix', 'posix',
'ftp', 'ftp',
'maildir' 'maildir',
'LSaccessRightsMatrixView'
); );

View file

@ -61,9 +61,17 @@ function LSaccessRightsMatrixView() {
$LSprofiles = array( $LSprofiles = array(
'user' => _('All connected users'), 'user' => _('All connected users'),
); );
// Authenticable user objects types
$authObjTypes = LSauth :: getAuthObjectTypes();
foreach ($authObjTypes as $objType => $objParams)
if (LSsession :: loadLSobject($objType))
$LSprofiles[$objType] = LSldapObject :: getLabel($objType);
// Custom configured LSprofiles
if (isset(LSsession :: $ldapServer["LSprofiles"]) && is_array(LSsession :: $ldapServer["LSprofiles"])) if (isset(LSsession :: $ldapServer["LSprofiles"]) && is_array(LSsession :: $ldapServer["LSprofiles"]))
foreach(LSsession :: $ldapServer["LSprofiles"] as $LSprofile => $LSprofile_conf) foreach(LSsession :: $ldapServer["LSprofiles"] as $LSprofile => $LSprofile_conf)
$LSprofiles[$LSprofile] = (isset($LSprofile_conf['label'])?__($LSprofile_conf['label']):$LSprofile); $LSprofiles[$LSprofile] = (isset($LSprofile_conf['label'])?__($LSprofile_conf['label']):$LSprofile);
$LSobjects = array(); $LSobjects = array();
foreach (LSsession :: $ldapServer["LSaccess"] as $LSobject) { foreach (LSsession :: $ldapServer["LSaccess"] as $LSobject) {
if (!LSsession :: loadLSobject($LSobject)) if (!LSsession :: loadLSobject($LSobject))
@ -74,7 +82,7 @@ function LSaccessRightsMatrixView() {
foreach(LSconfig :: get("LSobjects.$LSobject.attrs", array()) as $attr_name => $attr_config) { foreach(LSconfig :: get("LSobjects.$LSobject.attrs", array()) as $attr_name => $attr_config) {
$raw_attr_rights = LSconfig :: get('rights', array(), 'array', $attr_config); $raw_attr_rights = LSconfig :: get('rights', array(), 'array', $attr_config);
$attr_rights = array(); $attr_rights = array();
if ($LSobject == LSsession :: get('authenticated_user_type')) if (array_key_exists($LSobject, $authObjTypes))
$attr_rights['self'] = LSconfig :: get('self', False, null, $raw_attr_rights); $attr_rights['self'] = LSconfig :: get('self', False, null, $raw_attr_rights);
foreach(array_keys($LSprofiles) as $LSprofile) { foreach(array_keys($LSprofiles) as $LSprofile) {
$attr_rights[$LSprofile] = LSconfig :: get($LSprofile, False, null, $raw_attr_rights); $attr_rights[$LSprofile] = LSconfig :: get($LSprofile, False, null, $raw_attr_rights);
@ -90,7 +98,7 @@ function LSaccessRightsMatrixView() {
foreach(LSconfig :: get("LSobjects.$LSobject.LSrelation", array()) as $relation_name => $relation_config) { foreach(LSconfig :: get("LSobjects.$LSobject.LSrelation", array()) as $relation_name => $relation_config) {
$raw_relation_rights = LSconfig :: get('rights', array(), 'array', $relation_config); $raw_relation_rights = LSconfig :: get('rights', array(), 'array', $relation_config);
$relation_rights = array(); $relation_rights = array();
if ($LSobject == LSsession :: get('authenticated_user_type')) if (array_key_exists($LSobject, $authObjTypes))
$relation_rights['self'] = LSconfig :: get('self', False, null, $raw_relation_rights); $relation_rights['self'] = LSconfig :: get('self', False, null, $raw_relation_rights);
foreach(array_keys($LSprofiles) as $LSprofile) { foreach(array_keys($LSprofiles) as $LSprofile) {
$relation_rights[$LSprofile] = LSconfig :: get($LSprofile, False, null, $raw_relation_rights); $relation_rights[$LSprofile] = LSconfig :: get($LSprofile, False, null, $raw_relation_rights);
@ -112,7 +120,7 @@ function LSaccessRightsMatrixView() {
reset($LSobjects); reset($LSobjects);
$LSobject = (isset($_REQUEST['LSobject']) && array_key_exists($_REQUEST['LSobject'], $LSobjects)?$_REQUEST['LSobject']:key($LSobjects)); $LSobject = (isset($_REQUEST['LSobject']) && array_key_exists($_REQUEST['LSobject'], $LSobjects)?$_REQUEST['LSobject']:key($LSobjects));
if ($LSobject == LSsession :: get('authenticated_user_type')) if (array_key_exists($LSobject, $authObjTypes))
$LSprofiles = array_merge(array('self' => _('The user him-self')), $LSprofiles); $LSprofiles = array_merge(array('self' => _('The user him-self')), $LSprofiles);
LSlog :: get_logger('LSaddon_LSaccessRightsMatrixView') -> debug($LSobjects); LSlog :: get_logger('LSaddon_LSaccessRightsMatrixView') -> debug($LSobjects);

View file

@ -1896,9 +1896,10 @@ class LSsession {
$access=array(); $access=array();
foreach(self :: $ldapServer['LSaccess'] as $objectType) { foreach(self :: $ldapServer['LSaccess'] as $objectType) {
if (self :: loadLSobject($objectType)) { if (self :: loadLSobject($objectType)) {
if (self :: canAccess($objectType)) { if (self :: canAccess($objectType))
$access[$objectType] = LSconfig :: get('LSobjects.'.$objectType.'.label'); $access[$objectType] = $objectType :: getLabel();
} else
self :: log_debug("loadLSaccess(): authenticated user have no access to $objectType");
} }
} }
$LSaccess[self :: $topDn] = $access; $LSaccess[self :: $topDn] = $access;
@ -2005,6 +2006,9 @@ class LSsession {
public static function whoami($dn) { public static function whoami($dn) {
$retval = array('user'); $retval = array('user');
if (self :: $LSuserObjectType)
$retval[] = self :: $LSuserObjectType;
foreach(self :: $LSprofiles as $profile => $infos) { foreach(self :: $LSprofiles as $profile => $infos) {
if(self :: isLSprofile($dn,$profile)) { if(self :: isLSprofile($dn,$profile)) {
$retval[]=$profile; $retval[]=$profile;