Zend_Acl-Advanced.xml 5.1 KB

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