3

私はyiiのさまざまなオンラインチュートリアルとドキュメントに従ってRBACを学習しようとしていますが、最終的には次のようなもので終わります。何かが足りませんが、何がわかりません。私は理論とチュートリアルを2回勉強しましたが、それでも実際の実装に苦労しているので、最終的にSOコミュニティに助けを求めることにしました。私が今までやったことは正確に下にあります

**I step**
create a table with fields:  username,password,email,role
role is enum datatype with 4 roles values ('superadmin','admin','useractive','userpassive')

**II step**
then i imported the schema-mysql.sql file in my database from the framework/web/auth folder of my yii setup.


**III step**
configured my config.php for CDbauthmanager

'authManager'=>array(
    'class'=>'CDbAuthManager',
'connectionID'=>'db',
'itemTable'=>'AuthItem',
'itemChildTable'=>'AuthItemChild',
'assignmentTable'=>'AuthAssignment',
),


**IV step**

then i added few lines to UserIdentity.php

public function authenticate()
{
    $user = Users::model()->findByAttributes(array('email'=>$this->username));
if ($user===null) { // No user found!
    $this->errorCode=self::ERROR_USERNAME_INVALID;
} 
    else if ($user->password !== $this->password ) 
    { // Invalid password!
    $this->errorCode=self::ERROR_PASSWORD_INVALID;
} else { // Okay!
        $this->errorCode=self::ERROR_NONE;
        // Store the role in a session:
        $this->setState('roles', $user->role);
    $this->_id = $user->id;
}
    return !$this->errorCode;
}
public function getId()
{
 return $this->_id;
}

**V step**

then i inserted values manually in the RBAC required table i.e. AuthItem,AuthItemChild,AuthAssignment

AuthItem table values
================================================================
name         type   description     bizrule data
user1        2          the user1 role      NULL    NULL
updateProfile    0          update profile      NULL    NULL
================================================================

AuthItemChild 
================================================================
parent  child
user1   updateProfile
================================================================

AuthAssignment table values
================================================================
itemname    userid  bizrule data
user1   1   NULL    NULL

And My users table
=================================================================
username    password    email             role
test1       pass1       tes1@local.com    user1

**VI step**

after that i tried to play with a controller

public function actionIndex()
{
    if(Yii::app()->user->checkAccess('updateProfile'))
    {
        echo "yes";
    }
    else
    {
        echo "missing something";
    }
}

ログに記録してコントローラーにアクセスしようとすると、user1「何かが足りません」と表示されますが、ユーザーに同じ役割を割り当てています。私が行方不明になっている地獄。

これは私が行方不明の部分を正確に行ったことです。私はこれをほとんど行うことができないことを知りません。

貴重な時間をありがとうございました

4

1 に答える 1

0

「user1」と呼ばれる役割に注意してください。まだ知らなかった場合:これはユーザーではなく、単にuser1と呼ばれる役割であり、将来戻ってきた場合は混乱する可能性があります:)

テーブルのデータは問題ないようです。ロール(user1)、オペレーション(updateProfile)を追加し、updateProfileアクションを「user1」の子としてリンクしました。また、AuthAssignmentは、ロールuser1がuserid 1に追加されていることを示しているため、これで問題ありません。

問題は、CWebUserインスタンスで何もしていないように見えるという事実にあると思います。Yii :: app()-> userはCWebUserインスタンスであり、ユーザーIDが関連付けられている必要があります。これを割り当てるコードがないので、おそらくNULLです。NULLは、Yiiがユーザーをゲストと見なすことを意味します。確認するために、Yii :: app()->user->idのvar_dumpを実行してみてください。

正しい方法は、次のように、ログインを行う行をどこかに置くことです。Yii :: app()-> user-> login(、);

それか、怠惰な方法でYii :: app()-> user->id=;を実行します。

于 2012-06-21T14:06:15.217 に答える