スポンサードリンク

CakePHP
CakePHP

日々続けているCakePHP日記

徐々にではありますが

覚えてきた内容も増えてきました。

まだ、全然使いこなすことはできていませんが

便利なフレームワークということはわかりました。

今回はログイン機能を付けたあと

ログイン無しでもアクセスできるアクションの設定をしてみました。

スポンサードリンク

特定のアクションのみアクセスできるように設定

CakePHPはログイン機能を使うために

AuthComponentを使うのですが、

※ログイン機能に関しては前回の記事を参考にしてください。
初めての[CakePHP2.x]での開発、そして挫折するまで日記~その13 ログイン機能を付ける

その際、AppController.phpに以下のように記述します。

// app/Controller/AppController.php
class AppController extends Controller {
    //...

    public $components = array(
        'Session',
        'Auth' => array(
            //ログイン後のページ遷移先 
            'loginRedirect' => array('controller' => 'posts', 'action' => 'index'),
            //ログアウト後のページ遷移先
            'logoutRedirect' => array('controller' => 'users', 'action' => 'login')
        )
    );
    //...
}

こうすると、すべてのアクションでログインが必要になります。

ページにアクセスしようとしても

リダイレクトが起こってログインページに飛ばされます。

例えば、会社概要など

ログインしていないユーザーでも

アクセスできるアクションがないといけないので

ログインしていなくてもアクセスできるようにします。

方法はbeforeFilter関数で、AuthComponentに

アクセスできるアクションを教えないといけません。

書く場所はAppControllerか

各コントローラーに記述します。

AppController.phpでアクセス制限

AppController.phpに書いた

$componentsの下に以下のように書きます。

public function beforeFilter() {
        $this->Auth->allow('index', 'view');
}

こうすると、すべてのコントローラーアクションのindexとviewメソッドに

アクセスできるようになります。

各コントローラーに共通アクションがあって

同じように認証がいらないのな

こんな風にしておけばいいと思います。

各コントローラー別にアクセスを制限

すべてのアクションではなく

特定のコントローラーのアクションのみの場合は

以下のように書きます。

(例)UsersController.php

public function beforeFilter() {
	//ログインしていないときにアクセス可能
	$this->Auth->allow('login', 'logout');
}

例だとログイン画面とログアウト画面は

ログインしていなくてもアクセスできないといけないので

ログインしてなくてもアクセスできるようにしています。

アクセス制限はこんな感じでAppControllerに書かずに

各コントローラーで指定した方がいいかもしれません。

しかし、このままではログインはできましたが、

各アクションで許可が必要になるため

アクションにアクセスできるための許可を設定します。

スポンサードリンク

isAuthorizedというメソッドで認証を許可

isAuthorizedというメソッドで認証を許可します。

AppContorollerか各コントローラーで設定します。

public function isAuthorized($user) {
    if (isset($user['role']) && $user['role'] === 'admin') {
       //adminは許可 
       return true;
    }
    // デフォルトは拒否
    return false;
}

isAuthorizedがtrueを返すと認証が成功してアクセスが可能になります。

falseを返すと失敗となります。

例だとadminのロールを持つユーザーは

ログインしたらサイト内の全てのURLにアクセスすることができます。

権限が許可されていないユーザーはアクセスできません。

AppConrtollerに記述すれば、すべてのアクションに許可がおります。

各コントローラーに記述すれば、

記述されたコントローラーで許可がおります。

(参考)
CakePHP 内の固定ページに対するアクセスコントロール

CakePHP2.0のAuthコンポーネントで会員制サイト(ACLを使わない簡単なアクセス制御)

スポンサードリンク