Zend_Acl-Refining.xml 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <sect1 id="zend.acl.refining">
  2. <title>접근 제어의 정련(精鍊)</title>
  3. <sect2 id="zend.acl.refining.precise">
  4. <title>정확한 접근 제어</title>
  5. <para>
  6. <link linkend="zend.acl.introduction">이전 장</link>에서 정의한 기본적인 ACL에서는, 다양한
  7. 규칙을 ACL 전체(모든 자원)에 대해서 적용했습니다. 그러나 실제로 접근 제어에는 다양하고 복잡한
  8. 단계와 예외사항을 만나기 쉽습니다. Zend_Acl은 이러한 경우에도 간단하고 유연한 방법으로
  9. 대응할 수 있습니다.
  10. </para>
  11. <para>
  12. 예로 든 CMS에서 대부분의 유저를 'staff'그룹에서 정리해 관리하고 있었습니다. 여기에서는 CMS의
  13. 뉴스레터나 최신 뉴스에의 접근을 필요로 하는 'marketing'이라는 새로운 그룹을 만듭니다. 이 그룹은
  14. 뉴스레터 및 최신 뉴스의 발행과 보존 권한을 가집니다.
  15. </para>
  16. <para>
  17. 덧붙여, 'staff'그룹은 뉴스의 내용은 열람할 수는 있지만, 최신 뉴스의 수정은 할 수 없게 합니다.
  18. 마지막으로, 누구라도 (administrators를 포함해서) '발표' 뉴스 내용은 보존할 수 없게 합니다.
  19. 왜냐하면, 그것들의 유효기간은 1 ~ 2일 정도 밖에 되지 않기 때문입니다.
  20. </para>
  21. <para>
  22. 먼저, 이러한 변경을 반영시키기 위해 롤 레지스트리를 수정합니다. 'staff'그룹과 동일한 기본 권한을
  23. 가지는 'marketing'그룹을 만들기로 했으므로, 'marketing'그룹을 만들고, 'staff'그룹으로 부터 권한을
  24. 상속받습니다:
  25. </para>
  26. <programlisting role="php"><![CDATA[<?php
  27. // 새로운 marketing그룹은 staff그룹으로부터 권한을 상속받습니다
  28. $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');]]>
  29. </programlisting>
  30. <para>
  31. 다음에, 위의 접근 제어는 특정 자원(예: "newsletter","latest news","announcement news")에 대해 한정되는 것에 주의하시기 바랍니다. 이제 우리는 다음과 같이 이들 자원을 추가합니다:
  32. </para>
  33. <programlisting role="php"><![CDATA[<?php
  34. // 규칙을 적용할 자원을 만듭니다
  35. require_once 'Zend/Acl/Resource.php';
  36. $acl->add(new Zend_Acl_Resource('newsletter')); // newsletter
  37. $acl->add(new Zend_Acl_Resource('news')); // news
  38. $acl->add(new Zend_Acl_Resource('latest'), 'news'); // latest news
  39. $acl->add(new Zend_Acl_Resource('announcement'), 'news'); // announcement news]]>
  40. </programlisting>
  41. <para>
  42. 그러면, 이들에게 ACL의 해당 범위에 특정 규칙들을 정의하는 문제는 간단합니다:
  43. </para>
  44. <programlisting role="php"><![CDATA[<?php
  45. // Marketing그룹은 뉴스레터 및 최신 뉴스를 발행, 보존할 수 없으면 안됩니다
  46. $acl->allow('marketing', array('newsletter', 'latest'), array('publish', 'archive'));
  47. // Staff (그리고 상속에 의한 marketing)그룹은 최신 뉴스의 수정을 할 수 없습니다
  48. $acl->deny('staff', 'latest', 'revise');
  49. // 전원 (administrators를 포함해서)은 발표 뉴스를 보존할 수 없습니다
  50. $acl->deny(null, 'announcement', 'archive');]]>
  51. </programlisting>
  52. <para>
  53. 이것으로, 이제 최신 변경 내용을 반영한 ACL에 질의할 수 있습니다:
  54. </para>
  55. <programlisting role="php"><![CDATA[<?php
  56. echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
  57. "allowed" : "denied"; // denied
  58. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  59. "allowed" : "denied"; // allowed
  60. echo $acl->isAllowed('staff', 'latest', 'publish') ?
  61. "allowed" : "denied"; // denied
  62. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  63. "allowed" : "denied"; // allowed
  64. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  65. "allowed" : "denied"; // allowed
  66. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  67. "allowed" : "denied"; // denied
  68. echo $acl->isAllowed('editor', 'announcement', 'archive') ?
  69. "allowed" : "denied"; // denied
  70. echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
  71. "allowed" : "denied"; // denied]]>
  72. </programlisting>
  73. </sect2>
  74. <sect2 id="zend.acl.refining.removing">
  75. <title>접근 제어의 삭제</title>
  76. <para>
  77. ACL로부터 하나 또는 복수의 접근 규칙을 삭제하려면, <code>removeAllow()</code> 또는 <code>removeDeny()</code> 메소드를 사용합니다. <code>allow()</code> 및 <code>deny()</code>와 같이, null값을 지정하면 모든 롤이나 자원, 권한을 나타내게 됩니다:
  78. </para>
  79. <programlisting role="php"><![CDATA[<?php
  80. // staff(그리고 상속에 의한 marketing)그룹으로부터 최신 뉴스의 수정 거부를 삭제합니다
  81. $acl->removeDeny('staff', 'latest', 'revise');
  82. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  83. "allowed" : "denied"; // allowed
  84. // marketing그룹으로부터 뉴스레터의 발행 및 보존 권한을 없앱니다
  85. $acl->removeAllow('marketing', 'newsletter', array('publish', 'archive'));
  86. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  87. "allowed" : "denied"; // denied
  88. echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
  89. "allowed" : "denied"; // denied]]>
  90. </programlisting>
  91. <para>
  92. 위에서 설명한 것처럼, 서서히 권한을 변경해 나갈 수도 있습니다만, 권한에 대해서 <code>null</code>
  93. 값을 설정하면, 이러한 변경을 일괄적으로 수행할 수 있습니다.
  94. </para>
  95. <programlisting role="php"><![CDATA[<?php
  96. // marketing그룹에 대해 최신 뉴스의 모든 권한을 허가합니다
  97. $acl->allow('marketing', 'latest');
  98. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  99. "allowed" : "denied"; // allowed
  100. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  101. "allowed" : "denied"; // allowed
  102. echo $acl->isAllowed('marketing', 'latest', 'anything') ?
  103. "allowed" : "denied"; // allowed]]>
  104. </programlisting>
  105. </sect2>
  106. </sect1>