CakePHPで「Controller does not implement an isAuthorized() method.」の対処法

CakePHPで「Controller does not implement an isAuthorized() method.」の対処法

357 回閲覧されました

みなさんこんにちは、jonioです。

CakePHPであるページにアクセスした時に下記のエラーが表示されました。

App\Controller\ReviewsController does not implement an isAuthorized() method.

解決方法が分かったのでメモとしてこの記事を残します。

CakePHPのバージョン

CakePHPのバージョン3.1.0と4.5.3で確認できたので2つのバージョンの間は有効だと思います。

コントーラーを作成するたびに設定しないといけない

調べた限りですがコントローラーを作成するたびにindexアクション以外のアクションはisAuthorizedメソッドの設定をしないとエラーになります。

isAuthorizedメソッドのコードの書き方は下記になります。

class ReviewsController extends AppController
{
    public function isAuthorized() {
        return true;
    }
    
    
    //以下はbakeコマンドで自動的に作成されるアクション

これでコントローラー内の全てのアクションに対して適用されます。

4行目の「true」でアクションが許可されるのでページにアクセスできるようになりますが「false」にするとアクセスできなくなります。

ログインした時にアクションを許可する

ChatGPTに質問したのですがコントローラーごとにどのアクションを許可するかの設定は条件(カラムの値が特定の値かとか)を付けないとできないみたいです。

条件を付けて一部のアクションを許可する時のコードの書き方は例えば下記になります。

今回はログインユーザーのroleカラムの値がadminかそうでないかで場合分けをします。

public function isAuthorized($user) {
  if ($this->request->getParam('action') == 'add') {
    if ($user['role'] == 'admin') {
      return true;
    }
  }
       
  return false;
}

1行目の「$user」はログインしているユーザーの情報です、これはいきなり書いて使うことができます。

2行目の「add」はaddアクションです。

2行目から5行目にかけての流れは「addアクションはログインユーザーの権限がadminなら許可する」という意味です。

こんな感じならコントローラーで一部のアクションを許可することができます。