Yii 2.0ログイン機能コード実装

11091 ワード

yiiアーカイブファイルのbasicアプリケーションにはログイン機能があります.user関連を参照してください.同時にbasicには基本ログインLoginテンプレートが付いています.
一、コントロール/アクションの確立
ここではSiteControllerのactionLoginメソッドを使用します.
namespace app\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\Userinfo;
use app\models\ContactForm;
use app\models\EntryForm;

class SiteController extends Controller {

使用するbasicのデフォルトsiteController
public function actionLogin() {
        if (!\Yii::$app->user->isGuest) {
            return $this->goHome();
        }

        $model = new LoginForm();

        if ($model->load(Yii::$app->request->post()) && $model->login()) {
            return $this->goBack();
        }

        return $this->render('login', [
            'model' => $model,
        ]);
    }

アクションもデフォルトです.
二、ModelとLoginForm
public function login() {
    if ($this->validate()) {
        return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0);
    }
    return false;
}

public function getUser() {
    if ($this->_user === false) {
        $this->_user = Userinfo::validateUsername($this->username, $this->password);
    }

    return $this->_user;
}

LoginFormのデフォルトloginメソッドでは、yii/app/webの下でsessionとcookieにuser情報を返す必要があります.記録された情報は$this->getUser()で返されるstaticクラスで、以下のようになります.
public static function validateUsername($username, $password) {
    try {
        $records = Yii::$app->db->createCommand("select * from userinfo where username = '".$username."'")->queryAll();
    } catch (Exception $e) {
        var_dump($e);
    }

    if ($records && $records[0]["password"] == $password) {
        $currentUser = [
            'usernameL' => $records[0]["username"],
            'passwordL' => $records[0]["password"],
            'emailAddressL' => $records[0]["emailAddress"],
            'authKey' => 'test100key',
            'accessToken' => '100-token',
        ];
        return new static($currentUser);
    }

    return null;
}

static($currentUser)は、現在作成されているクラスです.属性は次のとおりです.
class Userinfo extends \yii\db\ActiveRecord implements \yii\web\IdentityInterface {
    public $usernameL;
    public $passwordL;
    public $emailAddressL;
    public $authKey;
    public $accessToken;

三、yii登録の基本原理
1、パラメータを構成し、user拡張を加える必要がある
'components' => [
        'user' => [
            'identityClass' => 'app\models\Userinfo',
            'enableAutoLogin' => true,
        ],
        ...
]

identityClassとは、userを処理するためのmodelであり、Yii 2の高度テンプレートが持参したuserを使用してもよいし、自分で書くこともでき、IdentityInterfaceインタフェースを実現する必要がある(ここではuserInfoと書いてgiiのcrudを利用して生成)
2、userについて
userを構成したら、Yii::$app->userアクセスをグローバルに使用できます.userの重要な属性、isGuest:ユーザーがログインしているかどうかを判断する;id、ログインユーザーの唯一の識別識別標識を保存し、私たち自身が設定し、具体的にどのように設定するか、そして後文の分解を見る.userの重要な方法、login():ユーザー情報をsession、cookieに保存する.logout():セッション、クッキーからユーザー情報を破棄する.Note that User only maintains the user authentication status.It does NOT handle how to authenticate a user.The logic of how to authenticate a user should be done in the class implementing yiiwebIdentityInterface.//userコンポーネントの作業は、ユーザーの認証状態(すなわち、簡単な操作sessionとcookie)を維持することだけです.ユーザーの認証には責任を負いません.認証プロセスの論理実装はすべてIdentityInterfaceインタフェースを実装したクラスによって実現される.
3、IdentityInterface
このインタフェースは5つの関数を定義しています:findIdentity()getId(); findIdentityByAccessToken(); getAuthKey(); validateAuthKey; この5つの関数の中で、最も重要なのはgetid()かもしれません.この関数はあなたが実現し、userに渡されたオブジェクトがlogin時に呼び出され、userのid属性値を設定します!したがって、この関数を実装するときに何を返すのか、userコンポーネントが覚えているuser idは何なのか.その他のいくつかの関数の具体的な実装は、ドキュメントを参照してください.
4、ログイン
ユーザログイン情報を保存したデータテーブルに対応するUserというARモデルクラス(アプリケーションコンポーネントuserの違いに注意)を定義したとします.ユーザー認証を完了するためにUserを使用する場合は、上記のIdentityInterfaceを実装する必要があります.1、サーバーはユーザーに提出されたユーザー名とパスワードを受け入れる;2、Userインスタンス$modelを生成する;3、賦課値:$model->load(Yii::$app->request->post()); 4、ユーザー入力の検査及びユーザー名とパスワードの検証:$model->validate(); 5、登録Yii::$app->user->login($model,$duration);5、自動ログイン
自動ログインを実現するには、パラメータ$enableAutoLoginを設定する必要があります.$durationはゼロより大きくなければならない.$isGuestを使用して、ユーザがログインしたか否かを判断する.
四、出会った問題
class Userinfo extends \yii\db\ActiveRecord implements \yii\web\IdentityInterface {
    public $usernameL;
    public $passwordL;
    public $emailAddressL;
    public $authKey;
    public $accessToken;

modelにはデータベース属性があります.ここではログイン属性を記録します.両者の名前が異なる必要があります.そうしないと、ユーザーの追加に影響します.