2
0

Zend_Acl-Advanced.xml 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 15101 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.acl.advanced">
  5. <title>Utilisation avancée</title>
  6. <sect2 id="zend.acl.advanced.storing">
  7. <title>Rendre les données ACL persistantes</title>
  8. <para>
  9. <classname>Zend_Acl</classname> a été conçu pour ne pas nécessiter de technologie
  10. spécifique comme une base de données ou un serveur de cache pour conserver les données
  11. ACL. Son implémentation PHP permet de créer des outils d'administration assez
  12. facilement. De nombreuses situations nécessitent une certaine forme de maintenance ou
  13. de gestion des ACL, et <classname>Zend_Acl</classname> fournit les méthodes pour
  14. définir et interroger les règles d'accès d'une application.
  15. </para>
  16. <para>
  17. Le stockage des données ACL est dès lors laissé aux bons soins du développeur,
  18. dans la mesure où les cas d'utilisation peuvent grandement varier d'un cas à l'autre.
  19. Puisque <classname>Zend_Acl</classname> est sérialisable, les objets ACL peuvent être
  20. sérialisés avec la fonction
  21. <ulink url="http://fr.php.net/serialize"><code>serialize()</code></ulink>, et le
  22. résultat peut être stocké n'importe où le développeur le désire : fichier, base de
  23. donnée, cache.
  24. </para>
  25. </sect2>
  26. <sect2 id="zend.acl.advanced.assertions">
  27. <title>Écrire des règles ACL conditionnelles avec des assertions</title>
  28. <para>
  29. Parfois, une règle pour autoriser ou interdire l'accès d'un rôle à une ressource
  30. n'est pas absolu, mais dépend de plusieurs critères. Par exemple, supposons qu'un
  31. certain accès peut être autorisé, mais uniquement entre 8h du matin et 5h du soir. Un
  32. autre exemple consisterait à interdire l'accès parce que la requête provient d'une
  33. adresse IP qui est notée comme source d'abus. <classname>Zend_Acl</classname> dispose
  34. d'un support intégré pour implémenter des règles sur quoique ce soit dont le
  35. développeur ait besoin.
  36. </para>
  37. <para>
  38. <classname>Zend_Acl</classname> fourni le support pour les règles conditionnelles
  39. via <classname>Zend_Acl_Assert_Interface</classname>. Pour mettre en oeuvre cette
  40. interface, il suffit d'implémenter la méthode <code>assert()</code> :
  41. </para>
  42. <programlisting language="php"><![CDATA[
  43. class CleanIPAssertion implements Zend_Acl_Assert_Interface
  44. {
  45. public function assert(Zend_Acl $acl,
  46. Zend_Acl_Role_Interface $role = null,
  47. Zend_Acl_Resource_Interface $resource = null,
  48. $privilege = null)
  49. {
  50. return $this->_isCleanIP($_SERVER['REMOTE_ADDR']);
  51. }
  52. protected function _isCleanIP($ip)
  53. {
  54. //...
  55. }
  56. }
  57. ]]></programlisting>
  58. <para>
  59. Lorsqu'une classe d'assertion est disponible, le développeur doit fournir une
  60. instance de cette classe lorsqu'il assigne une règle conditionnelle. Une règle qui est
  61. créée avec une assertion s'applique uniquement dans les cas où l'assertion retourne une
  62. valeur <code>true</code>.
  63. </para>
  64. <programlisting language="php"><![CDATA[
  65. $acl = new Zend_Acl();
  66. $acl->allow(null, null, null, new CleanIPAssertion());
  67. ]]></programlisting>
  68. <para>
  69. Le code ci-dessus crée une règle conditionnelle qui autorise l'accès à tous les
  70. privilèges, sur tout et pour tout le monde, sauf lorsque l'adresse IP de la requête
  71. fait partie de la liste noire. Si une requête provient d'une adresse IP qui n'est pas
  72. considérée comme "propre", alors la règle d'autorisation ne s'applique pas. Puisque la
  73. règle s'applique à tous les rôles, toutes les Ressources, et tous les privilèges, une
  74. IP "sale" aboutira à un refus d'accès. Ceci constitue un cas spécial, et il faut bien
  75. noter que tous les autres cas (donc, si un rôle, une ressource ou un privilège est
  76. défini pour la règle), une assertion qui échoue aboutit à une règle qui ne s'applique
  77. pas et ce sont alors les autres règles qui servent à déterminer si l'accès est autorisé
  78. ou non.
  79. </para>
  80. <para>
  81. La méthode <code>assert()</code> d'un objet d'assertion reçoit l'ACL, le rôle, la
  82. ressource et le privilège auquel une requête d'autorisation (c.a.d.,
  83. <code>isAllowed()</code>) s'applique, afin de fournir un contexte à la classe
  84. d'assertion pour déterminer ses conditions lorsque cela est nécessaire.
  85. </para>
  86. </sect2>
  87. </sect1>