6

禁止されたユーザーがサイトにログインできないようにし、禁止されているというメッセージを表示したい. これに isAuthorized() を使用しようとしましたが、ユーザーがログインできるようになり、その後でのみ、許可されていないアクションへの許可が拒否されます。

したがって、基本的に、ログインプロセスが行われる前に、ユーザーテーブルが禁止されているかどうかを確認する条件をどこに置くかを知りたいです。現在、認証コンポーネントによって自動的に制御されているため、ログイン機能は空です。

4

5 に答える 5

13

最後に、API を使用して解決策を見つけました。誰かがこれを使ったことがあるのだろうか、誰も私にこれを指摘しなかったので、あるいは私は十分に明確ではなかった. とにかく、ログイン プロセスに条件を追加するには、それを変数 $this->Auth->userScope に入れます。

したがって、ユーザーが禁止されているかどうかを確認するために、AppController の beforeFilter() に次の行を追加しました。

$this->Auth->userScope = array('User.banned'=>0);

これが誰かに役立つことを願っています。

于 2010-08-25T23:39:20.837 に答える
3

Auth システム全体がすでに稼働している場合は、KISS の原則に従って、パスワードを無効にするか、ユーザー名を変更してみませんか? 以前のようにシステムで認証できなくなった場合、彼らは禁止されていると推測できるはずです。

それでも十分でない場合は、さらに以下のコードを追加できます。

function login() {
  if ($this->Session->read('Auth.User')) {
    $this->Session->setFlash('You are alreadylogged in!~~~~~~~~~~~');   
  }
  $this->Session->setFlash('You have been banned!');    
  $this->redirect(array('controller'=>'users','action'=>'index'));
}

編集1:コメントで指摘したようなより動的なアプローチについては、懸念されているユーザーレコードの is_banned 列を確認し、UsersController::beforeFilter()それに応じてフラッシュメッセージを設定できます。の結果に基づいてリダイレクトも行い$this->Session->read('Auth.User.is_banned')ます。<?php debug $this->Session->read('Auth.User) ?>問題を攻撃する前に、の出力を見たいと思うかもしれません。

編集2:私のせいです。経由でセッションのどこかに is_banned を保存でき$this->Session->write(...)ます。を読んだらis_banned = true、ユーザーをログアウトできます。

于 2010-08-25T10:03:03.313 に答える
2

あなたが使用する必要があります:

/** Function is executed after the login*/
function isAuthorized() {
return true;
}

ユーザーが禁止されているかどうかを確認できます。すなわち

/** Function is executed after the login*/
function isAuthorized() {
if($this->Auth->user('banned') == 1){ //column banned should be in the users table
       $this->Session->setFlash('You have been banned!');    
       return false;
    }
    return true;
}

これが正しい方法だと思います。

于 2010-08-25T11:50:24.497 に答える
1

Nik の方法に関する最後のコメントを読んだ後、コードの適切な場所で $this->Auth->logout() を介してユーザーを手動でログアウトすることで、元のソリューションを改良できると思います (リダイレクトが続きます)。この方法では、ログインしていないように見えるはずです。

于 2010-08-25T12:55:38.840 に答える