web-dev-qa-db-ja.com

Auth / ACLをMVCに実装する正しい方法は何ですか?

私は正しくレイアウトされたMVC Auth/ACLシステムの作成を検討しています。 I thinkユーザーの認証(およびセッション処理)をACLシステムから分離したい。 (理由はわかりませんが、これは私が読んだことからは良い考えのようです。)

MVCはあなたが尋ねるこの質問とどう関係しているのですか?アプリケーションが私のACLとうまく統合されることを望んでいるからです。コントローラーの例(CodeIgniter):

<?php
class forums extends MX_Controller
{
    $allowed = array('users', 'admin');
    $need_login = true;

        function __construct()
        {
        //example of checking if logged in.
            if($this->auth->logged_in() && $this->auth->is_admin())
        {
            echo "you're logged in!";
        }
    }
    public function add_topic()
    {
        if($this->auth->allowed('add_topic')
        {
            //some add topic things.
        }
        else
        {
            echo 'not allowed to add topic';
        }
    }
}
?>

私の考え

$this->authはシステムに自動ロードされます。現在(ではなく)ログインしているユーザーに対して$allowed配列を確認し、それに応じて対応したいと思います。

これは物事を行うのに良い方法ですか? MVCの統合とAuthに関する文献はあまり見かけません。できるだけ簡単にしたい。

7
WiseStrawberry

Zend Framework内での私のアプローチは、認証を必要とするすべてのコントローラーが拡張する必要があるSecureControllerの基本クラスを持つことでした。 SecureControllerには、ユーザーがログインしているかどうかのディスパッチ前認証チェックがあり、それ以外の場合はログインページに転送します。

ログインチェックが完了したら、ユーザーがリソースとアクションにアクセスできるかどうかの承認チェックを実行します。通常、コントローラーは単一のリソースに関連付けられています(ただし、この動作はオーバーライドできます)。コントローラーのアクションは、リソースアクション。

これを実行すると、各子コントローラーで実行する必要があるのは、セキュリティチェックを再度呼び出すことなく、リソースとアクションを実行中の処理にマップすることだけです。

特にビュー生成で特定のACLチェックが必要な場合は、ユーザーのセッションに関連付けられているZend_ACLインスタンスを使用できます

私は自分の説明を思い付くように試みましたが、私の回答をまとめている最中に本当に包括的な投稿を見つけました。うまくいけば、あなたはこの投稿であなたが尋ねた以上のものを見つけるでしょう- PHP ACL実装

Edir:基本的に、投稿の背後にあるアイデアは、使用装飾パターンの使用を提案しています(詳細については、Wikiを参照してください)。単純な概念では、このパターンはオブジェクトを取得して、保護シェルのように機能する別のオブジェクトの中に配置することをお勧めします。この方法では、元のクラスを拡張するためにコードは必要ありません

1
Yusubov