- ベストアンサー
Zend_Aclアクセス制限について
- Zend_Aclを使用して、特定の権限を持つユーザーに対してアクセス制限を設定する方法を教えてください。
- 具体的には、product.phpというページをstaffという権限にアクセス許可する必要があります。
- また、$acl->add(new Zend_Acl_Resource('product.php'));と記述した場合、product.phpにはどのようなアクセスが許可されるのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
Zend_AclとZend_Roleの基本的な意味づけはだいたいわかっていると思う。ただ、組み合わせと実際のコーディングの流れがわからないということだろうか。 ACL(アクセス制御リスト)というのは、ユーザーとアクション(またはページ)の組み合わせにアクセス権を設定し、「このユーザーがこのアクションを要求したらこれを許可する」といった情報を管理するためのもの。だから、まずは「アクセスしたユーザーが誰か」が明確にできないといけない。そのために、認証機能が必要となる。Zendの場合には、Zend_Authを使ってユーザー認証を行うことになる。これがわからないようなので、まずはこの認証について勉強したほうがいいと思う。 認証ができたとして、あとの処理としては、アクセスした際に、 1.Zend_Aclを用意する。 $変数 = new Zend_Acl(); 2.ロールをAclに追加していく。 $変数 = new Zend_Acl_Role( ユーザ ); Zend_Aclインスタンス->addRole( $変数 ); 3.アクセス権を追加していく。 Zend_Aclインスタンス->allow( Zend_Acl_Roleインスタンス, null, アクション ); このallowで、Zend_Acl_Roleで指定したユーザーが、指定のアクションを要求したときにそれを許可するようになる。 4.アクセスしたユーザーのチェックをする Zend_Aclインスタンス->isAllowed( ユーザー , null , アクション ) これで、返値がtrueならば、そのユーザーがそのアクションの利用を許可されていることを示す。falseならば許可されていないことになる。 まあ、このへんの個々のメソッドなどはなんとなくわかっているようなので、改めてちょっとみなして書いてみればわかると思う。 記述する場所は、普通はinitだろう。通常、Zend Frameworkでは、アクションにアクセスされると、まずそのコントローラーのinitメソッドが呼び出される。したがって、一般的にはコントローラーのinitに、上記の1~4の処理を用意する。そして、Zend_Authで取得したユーザー名と、要求されたアクション名を引数にしてisAllowedを呼び出し、falseならばエラーページにリダイレクトするような処理をする。(trueならばそのままでいい) 簡単なサンプルを考えるなら、コントローラーのinitとしてこんな感じで処理を用意する。 public init(){ // Aclの準備 $acl = new Zend_Acl(); $guest = new Zend_Acl_Role('guest'); // guestユーザーの用意 $acl->addRole($guest); $acl->allow($guest,null,'index'); // guestにindexを許可する //ユーザー名とアクションの取得 $user = Zend_Auth::getInstance()->getIdentity(); // ユーザ名の取得 $action = $this->getRequest()->getActionName(); // アクション名の取得 // ACLチェック if ($acl->isAllowed($user,null,$action)){ throw new Zend_Exception('CANNOT ACCESS!'); } } これは、'gugest'に'index'アクションを許可するACL設定だけを用意したサンプルだが、こんな感じで必要に応じてユーザーとアクションを登録していくことになる。Zend_Authについては、とりあえず別途勉強してもらうとして、基本的な流れはこれでわかるだろうか?
その他の回答 (1)
これは、ちょっとこの回答欄で一から全部説明するには、内容が複雑すぎるな……。とりあえず、どこまで理解できているだろうか? 1.Zend_Aclでは、対象物をZend_Acl、利用者をZend_Roleで管理する。 2.アクセス制御を行うには、まず利用者のZend_Roleを作成する。 3.ついで、Zend_Aclを作成し、addRoleでZend_Roleを登録する。 4.ついで、Zend_Aclにallowで、特定のZend_Roleの特定のアクションに対するアクセス権を登録していく。 5.あるページにアクセスをした場合には、まずZend_Authで認証を行う。 6.認証されたユーザーをもとに、Zend_AclのisAllowedでそのユーザーが指定のアクションを許可されているかを調べる。そして結果に応じて、必要な措置(エラーページへのリダイレクトなど)を行う。 基本的な流れとしては、ざっとこんな感じになる。 A.まず、Zend_Aclを使うためには、Zend_Authによる認証の仕組みを理解している必要がある。 B.ついで、Zend_AclとZend_Roleの役割について理解している必要がある。 C.Zend_Roleによるユーザーの登録を理解する。 D.Zend_Aclに、Zend_Roleとアクションのアクセス権を登録する作業を行う。 とりあえず、これのどのへんまでわかっているだろうか。質問の「product.phpというページをstaffという権限にアクセス許可する場合は、どうしたら良いのでしょうか?」というのは、Dの作業で、このためにはA~Cまでできていないといけない。どこまで理解していて、どこで引っかかっているかをもう少し整理して補足してくれると、具体的な説明ができるかも知れない。
お礼
ご丁寧なご説明、ありがとうございました。 以下に、理解できていない点を明記いたします。 A.まず、Zend_Aclを使うためには、Zend_Authによる認証の仕組みを理解している必要がある。 →まったく理解していません。 Aという者が1というページを訪れた。 その際、1というページはAという者が見る事ができる権限を有するか、 確認をする、 という事で合っていますか? B.ついで、Zend_AclとZend_Roleの役割について理解している必要がある。 →ご説明で、おおよそ理解できました。 Zend_Aclは各ページに割り振る。 Zend_Roleは各権限者(利用者)に割り振る。 という事で合っていますか? C.Zend_Roleによるユーザーの登録を理解する。 → addRole(new Zend_Acl_Role('staff')) で、staffの登録について合っていますか? D.Zend_Aclに、Zend_Roleとアクションのアクセス権を登録する作業を行う。 → deny('staff', 'latest', 'revise'); では誤りですか? 見当はずれだったでしょうか。。。 なんだか、まったくわかっていませんが、説明からこうではないかと理解できたことをつらつらと記述させていただきました。
補足
以下について、説明より「こういうことかな?」という文もしくは、 理解のできているいないを明記します。 理解できているかの参考になればと思います。 1.Zend_Aclでは、対象物をZend_Acl、利用者をZend_Roleで管理する。 対象物とは、例えるなら、ページ1やページ2ということで合っていますか? 利用者とは、例えるなら、staffやguest等ということで合っていますか? addRole(new Zend_Acl('page1')); ※どこに記述するかわかっていません。 addRole(new Zend_Role('staff')); ※どこに記述するかわかっていません。 上の2文は合っていますか? 2.アクセス制御を行うには、まず利用者のZend_Roleを作成する。 addRole(new Zend_Role('staff')); ※どこに記述するかわかっていません。 この文を記述するということで合っていますか? 3.ついで、Zend_Aclを作成し、addRoleでZend_Roleを登録する。 addRole(new Zend_Acl('page1')); ※どこに記述するかわかっていません。 addRole(new Zend_Acl_Role('editor'), 'staff'); ※どこに記述するかわかっていません。 上の2文は合っていますか? 4.ついで、Zend_Aclにallowで、特定のZend_Roleの特定のアクションに対するアクセス権を登録していく。 3.と理解がかぶってしまいました。。。 5.あるページにアクセスをした場合には、まずZend_Authで認証を行う。 ここがまったくわかりませんでした。 参考は先にあげたAにある通りです。 6.認証されたユーザーをもとに、Zend_AclのisAllowedでそのユーザーが指定のアクションを許可されているかを調べる。そして結果に応じて、必要な措置(エラーページへのリダイレクトなど)を行う。 isAllowed('staff', 'latest', 'publish') ? "allowed" : "denied"; で合っていますか? 記述する場所は、各アクセス制限ページのテンプレート(Smarty使用)内で合っていますか?
お礼
ご丁寧にありがとうございました。 まだまだ、勉強不足で、使いこなせませんが、 認証と、記述していただいたinitを理解できるよう、 見ていきたいと思います。 ありがとうございました!