-2

セッション/Cookieの使用方法を知っています。ログインしているユーザーのセッションとCookie+トークンを保持します。

私はMVC構造(自分のもの)を使用していて、Login.phpコントローラーを持っています。インスタンスが1つしかないシングルトンクラスであるUser.phpクラスもあります。

私のベースコントローラーはUserのインスタンスを取得し、次のような変数に格納します。

   abstract class Controller {
    private $model;
    private $user;

    function __construct($model = '') {
        ..... //some code

        $this->user = User::getInstance();
    }

    public function user() {
        return $this->user;
    }
   }

私のlogin.phpには、ユーザーがユーザー名とパスを使用してフォームを送信すると、次のようになります。

function logUserIn() {
    if (! isset($_POST['UName']) || ! isset($_POST['UPass'])) {
        $this->_404();
    }

    $uname = strtolower($_POST['UName']);
    $pass = Hash::strongHashMD5($_POST['UPass']);
    $token = $_POST['token'];
    $isValid = $this->model->userCheck($uname, $pass);

    $res = $this->validateUser($isValid, $token, $uname);

    if ($res === false) {
        echo 'User Does Not Exist!';
    } else if ($res === 'Token_Error') {
        echo 'Invalid Form Submission';
    } else if ($res === true) {
        //update token
        $this->model->updateToken($isValid['ID'], $token, $_SERVER['REMOTE_ADDR']);
        header("Location: ../login");   
    }
    exit;
}

これはユーザーを検証する私の方法です

private function validateUser($UInfo, $token, $UName) {
    if ($UInfo !== false && isset($UInfo['ID']) && $UInfo['ID'] > 0) {
        if ($UInfo['token'] == $token) {
            return 'Token_Error';
        } else {
            $this->user()->setValues($UInfo['ID'], $UName, $token);
            $this->user()->setSessions();
            return true;
        }
    }

    return false;
}

setsessions()メソッドは、そのユーザーのセッション/Cookieを設定するだけです

これで、ユーザーがログインしているかどうかを確認するためにアクセスするたびに、コントローラーを介してアクセスし、他の場所に渡す必要があります。

これを行うためのより良い方法はありますか?セキュリティの問題などの点で私のコードに問題はありますか...

どんな提案/アドバイスも歓迎されます、みんなありがとう

4

1 に答える 1

0

現在、ドメインビジネスロジックがいたるところにリークしています。プレゼンテーション層ではなく、モデル層にとどまる必要があります(はい、適切なMVCでは、モデルはクラスやオブジェクトではなく層です) 。

また、MD5でのパスワードのハッシュを停止してください。そうする場合は、プレーンテキストのままにしておくことをお勧めします。代わりに、crypt()withCRYPT_BLOWFISH またはPBKDF2アルゴリズムのいずれかを使用する必要があります。

ああ..そして、フォームフィールドの1つが空の場合、人々を404にリダイレクトすることは、過剰反応のように少し見えます。

とりあえず ..


メイントピック:

ユーザー認証は、完全にモデルレイヤーで行う必要があります(より正確には、一部のRecognitionサービスで)。コントローラーは、モデルレイヤーにデータのみを提供し、POSTリクエストが送信された現在のビューに通知する必要があります。

サービスは、データを受信すると、のドメインオブジェクトを作成Userし、値を割り当てる必要があります。データが検証(ドメインオブジェクトの責任の1つ)に合格した場合、サービスは適切なデータマッパーをインスタンス化し、ストレージ(SQLデータベースである場合とそうでない場合があります)からデータをフェッチする必要があります。これが問題(ストレージ内のレコードの欠落など)で考えられる場合、ドメインオブジェクトは資格情報に準拠する必要があります。

これらのいずれかがいずれかの時点で失敗した場合、サービスはエラー状態に基づいて動作し、一時ストレージ(ほとんどの場合-セッション)に配置する必要があります。

ビューが応答を生成することになっている部分にアプリケーションが到達すると、ビューインスタンスはPOST、モデルレイヤーのエラー状態をチェックすることで要求に関する指示に反応し、HTTPヘッダーを応答のみとして送信することでリダイレクトを実行します。エラーが発生しました。

于 2012-09-13T01:27:29.807 に答える