[Cubicweb] Contexte de sécurité

Christophe de Vienne christophe at unlish.com
Tue Feb 24 18:17:46 CET 2015



Le 17/02/2015 10:11, Sylvain Thénault a écrit :
> On 16 février 19:56, Christophe de Vienne wrote:
>> Salut Sylvain,
> 
> Salut Christophe,
>  
>> J'ai poussé ce matin un cset qui aborde le problème de façon
>> radicalement différente.
> 
> pas eu le temps de regarder mais je tâche d'y jeter un oeil asap.
>  
>> L'idée est simplement d'injecter systématiquement les variables du
>> contexte de sécurité dans les args de cnx.execute.
>>
>> Le résultat est que les RQLExpressions, qu'elles soient exécutées
>> directement par _check ou injectées dans les requêtes en lecture par
>> rqlrewrite, peuvent faire référence à ces variables.
>>
>> J'ai mis un garde-fou en interdisant que les variables du contexte
>> (toutes préfixées par cnx_ dans les requêtes rql) ne soit surchargeable
>> par l'appel à execute().
> 
> ok, à première vue c'est intéressant. Ça peut même résoudre un besoin qu'on a
> ici, à savoir pouvoir écrire des requêtes dans l'ui (e.g pour bookmark ou card)
> qui référence l'utilisateur connecté.

Use-case intéressant en effet.

>  
>> Si cette solution est privilégiée (et il me semble qu'elle a de sérieux
>> atouts), la grosse question qui reste en suspend est la façon dont nous
>> y injecteront la liste des groupes auxquels l'utilisateur appartient (ce
>> qui viendrait dans une étape ultérieure, mais il faut y penser quand même).
>>
>> Je vois, pour l'heure, 2 options:
>>
>> - chaque groupe devient une variable du contexte, possiblement préfixées
>> par 'group:'. L'utilisateur admin aurait donc pour contexte:
>>
>>   {'user': 12, 'group:managers': True,
>>    consts.Authenticated: True, consts.Everyone: True}
>>
>> - Une seule variable contient la liste des groupes:
>>
>>   {'user': 12, 'groups': ['managers'],
>>    consts.Authenticated: True, consts.Everyone: True}
>>
>> (note que dans les deux cas, j'ai ajouté de nouvelles notions
>> 'authenticated' et 'everyone' sous forme de constantes, mais ce n'est
>> pas vraiment le sujet de ce mail).
>>
>> L'avantage de la première solution est que les variables ainsi définies
>> seraient utilisables dans les requêtes RQL en cas de besoin (modulo
>> l'injection de tous les autres groupes avec pour valeur 'False'),
>> contrairement à la deuxième. Cette dernière est cependant plus simple à
>> injecter dans le code qui vérifie les actuellement : elle semble donc
>> moins disruptive et plus réaliste.
> 
> j'avoue que j'aurais besoin d'exemple sur comment on va utiliser ça dans la
> vraie vie (incluant Authenticated et Everyone d'ailleurs, si possible). Ton idée
> au final c'est aussi de remplacer l'usage des groupes dans les permissions du
> schema par des rql expresssions ? Je suis pas sûr de comprendre pourquoi tu as
> besoin d'aller plus loin que ce que tu as fait, car on peut toujours faire 'U
> in_group G, G name "managers"' par ex.

Vérifier les groupes dans le RQL n'est pas une bonne idée (d'où mon
interrogation sur le format qu'on donne aux groupes dans le contexte)
car cela impose qu'ils soient fournis par la base.

Or un des intérêts de ce nouveau système est que la liste des groupes
peut être fourni par d'autres sources, et que ces groupes n'en sont pas
forcément: il peut aussi s'agir de simple flags.

Par exemple, 'authenticated' n'est pas vraiment un groupe mais on va
l'utiliser exactement pareil dans la définition des permissions.

Autre exemple, 'authenticated_recently' pourrait être fourni par une
policy qui garanti que l'utilisateur a été identifié il y moins de 5
minutes. Ça n'est pas un groupe à proprement parler, mais on pourrait
l'utiliser dans les permissions qui donnent accès à des zones sensibles
(utilisation de la carte bleu par ex, ou gestion des paramètres avancés).

Pour compléter ma réponse, les cas d'usage de Everyone et Authenticated
de base sont assez simples :

- Everyone: remplace avantageusement ('managers', 'users', 'anonymous').
  Chez nous, on remplace à la volée ce tuple par un autre correspondant
  à nos groupes dès qu'il est trouvé sur une relation par exemple. C'est
  un peu lourd pour un truc aussi simple.

- Authenticated: Même usage, remplacer ('managers', 'users'), qui n'est
  pas toujours valable.


A+

Christophe

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: OpenPGP digital signature
URL: <http://lists.cubicweb.org/pipermail/cubicweb/attachments/20150224/6428a6aa/attachment.sig>


More information about the Cubicweb mailing list