yii で新しいユーザー認証を追加する方法

不言
リリース: 2023-04-01 11:30:02
オリジナル
1345 人が閲覧しました

この記事は、Yii に新しいユーザー認証を追加する方法の詳細な分析と紹介です。必要な方は参照してください。

1 なぜ追加する必要があるのか​​。新しいユーザーですか? 検証:
Web サイトのバックエンドとフロントエンドを同じ Yii アプリケーション内に構築したいためです。ただし、フロントエンドにはメンバー管理センターも含まれており、2 つのユーザー検証はまったく異なります。 2 つの異なるログイン ページが必要であり、ユーザー情報は異なる Cookie またはセッションに保存する必要があるため、ユーザー認証をアプリケーションに追加する必要があります
2.yii ユーザー認証:
#。
##ユーザー検証をカスタマイズする前に、まず yii の検証および認可メソッドを理解する必要があります。
ユーザーを検証するには、検証ロジックを備えた検証クラスを定義する必要があります。 yii IUserIdentity インターフェースでは、異なるクラスが異なる検証メソッドを実装できます。通常、Yii はユーザー名とパスワードを検証するために使用される CUserIdentity クラスを、継承後に書き換える必要があります。 Authenticate() メソッドを使用して独自の
検証メソッドを実装します。具体的なコードは次のとおりです。
Php code

class UserIdentity extends CUserIdentity  
{  
    private $_id;  
    public function authenticate()  
    {  
        $record=User::model()->findByAttributes(array('username'=>$this->username));  
        if($record===null)  
            $this->errorCode=self::ERROR_USERNAME_INVALID;  
        else if($record->password!==md5($this->password))  
            $this->errorCode=self::ERROR_PASSWORD_INVALID;  
        else 
        {  
            $this->_id=$record->id;  
            $this->setState('title', $record->title);  
            $this->errorCode=self::ERROR_NONE;  
        }  
        return !$this->errorCode;  
    }  
    public function getId()  
    {  
        return $this->_id;  
    }  
}
ログイン後にコピー

ユーザーがログインすると、次のコードが呼び出されます。 :

Php コード

// 使用提供的用户名和密码登录用户  
$identity=new UserIdentity($username,$password);  
if($identity->authenticate())  
    Yii::app()->user->login($identity);  
else 
    echo $identity->errorMessage;
ログイン後にコピー


ユーザーが終了すると、次のコードが呼び出されます:
Php コード

// 注销当前用户  
Yii::app()->user->logout(); 
 其中的user是yii的一个components.需要在protected/config/main.php中定义
ログイン後にコピー

Php コード

'user'=>array(  
    // enable cookie-based authentication  
    'allowAutoLogin'=>true,  
        'loginUrl' => array('site/login'),  
),
ログイン後にコピー

Yii では、user はデフォルトで CWebUser クラスのインスタンスであるため、ここではユーザーのログイン検証を実装しました。ただし、ユーザーがログインしているかどうかに関係なく、ユーザーのすべてのアクションにアクセスできるようになりました。次のステップは、ユーザーのアクセスを許可することです。アクセス制御フィルターを見てみましょう。アクセス制御を備えた単純なコントローラー:

Php コード

class AdminDefaultController extends CController  
{   
    public function filters()  
        {  
            return array('accessControl');  
        }  
        public function accessRules()  
        {  
            return array(  
                array(  
                    'allow',  
                    'users' => array('@'),  
                ),  
                array(  
                    'deny',  
                    'users' => array('*')  
                ),  
            );  
        }  
}
ログイン後にコピー

filters メソッドで特定のフィルターを設定すると、filters メソッドによって返される配列に accessControl パラメーターがあることがわかります。は、CController クラスの filterAccessControl メソッドです。

Php コード

public function filterAccessControl($filterChain)  
{  
    $filter=new CAccessControlFilter;  
    $filter->setRules($this->accessRules());  
    $filter->filter($filterChain);  
}
ログイン後にコピー

内部に新しい CAccessControlFilter インスタンスを作成し、setRules.
$ のときに accessRules() メソッドによって返されるパラメータを渡します。 filter->filter($filterChain) その後、他のフィルターの呼び出しを続けます。

そして、すべての特定の承認ルールは、accessRules:

Php code

public function accessRules()  
    {  
        return array(  
            array('deny',  
                'actions'=>array('create', 'edit'),  
                'users'=>array('?'),  
            ),  
            array('allow',  
                'actions'=>array('delete'),  
                'roles'=>array('admin'),  
            ),  
            array('deny',  
                'actions'=>array('delete'),  
                'users'=>array('*'),  
            ),  
        );  
    }
ログイン後にコピー

で定義されます。特定のルールについては、yii マニュアルを参照してください。


3. 新しい検証システムを追加します:
最初に、CWebUser:
Php コードから CAdminUser を継承します。

class CAdminWebUser extends CWebUser  
{  
    public $loginUrl = array('admin/admin/login');  
}
ログイン後にコピー

これはコンポーネントに配置されます

グローバル アプリケーションの場合は、protected/config/main.php:


Php コードのコンポーネント セクションを渡します

'user'=>array(  
    // enable cookie-based authentication  
        'class' => 'CAdminUser',  
    'allowAutoLogin'=>true,  
       'loginUrl' => array('site/login'),  
),
ログイン後にコピー

モジュール内にある場合は、モジュール クラスの init メソッドに次のコードを追加します。

Php コード

$this->setComponents(array(  
       'adminUser' => array(  
                'class' => 'CAdminWebUser',  
                'allowAutoLogin' => false,  
        )  
));
ログイン後にコピー

最終呼び出しメソッド

Php コード

//全局应用  
Yii::app()->getComponent('adminUser');  
//在模块中  
Yii::app()->controller->module->getComponent('adminUser');
ログイン後にコピー

しかし、これだけでは不十分です。別のユーザーの検証と承認を実装するには、コントローラーのフィルターも変更する必要があります。 #最初のステップはフィルターをカスタマイズすることです:

Php コード

class CAdminAccessControlFilter extends CAccessControlFilter  
{  
    protected function preFilter($filterChain)  
    {  
        $app=Yii::app();  
        $request=$app->getRequest();  
        $user = Yii::app()->controller->module->getComponent('adminUser');  
        $verb=$request->getRequestType();  
        $ip=$request->getUserHostAddress();  
        foreach($this->getRules() as $rule)  
        {  
            if(($allow=$rule->isUserAllowed($user,$filterChain->controller,$filterChain->action,$ip,$verb))>0) // allowed  
                break;  
            else if($allow<0) // denied  
            {  
                $this->accessDenied($user);  
                return false;  
            }  
        }  
        return true;  
    }  
}
ログイン後にコピー

CController クラスの filterAccessController メソッドを書き直します
Php コード

public function filterAccessControl($filterChain)  
{  
    $filter = new CAdminAccessControlFilter();  
    $filter->setRules($this->accessRules());  
    $filter->filter($filterChain);  
}  
//在这里我们使用自定义的filter类替换了原来的filter
ログイン後にコピー

OK、このコントローラーの accessRules() で adminUser の承認を指定できます。
上記はこの記事の全内容です。その他の関連コンテンツについては、この記事が役立つことを願っています。 、PHP 中国語 Web サイトに注意してください。

関連する推奨事項:

PHP の Yii フレームワークでのログイン機能の実装について

yii2 の変更方法.0 ユーザー ログインに使用されるユーザー テーブルは別のテーブルです


以上がyii で新しいユーザー認証を追加する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート