0

我的 yii 应用程序中的登录过程有问题。我有两种不同类型的用户,包括管理站点和客户的管理员用户。我正在使用CwebUserUserIdentitiy管理这两个组的登录。但我的问题是,当客户登录网站时,他也可以访问管理页面。我想做的是说应用程序为他们创建两个不同的身份会话。我不想使用访问控制规则之类的东西。有什么方法可以用 Yii 风格为他们创建不同的会话吗?

4

3 回答 3

8

如果您不想像其中一条评论中建议的那样使用复杂的 RBAC 设置,则可以通过配置 2 个不同的用户组件来实现stateKeyPrefix

'user' => array(              // Webuser for the frontend
    'class'             => 'CWebUser',
    'loginUrl'          => array('site/login'),
    'stateKeyPrefix'    => 'frontend_',
),
'adminUser' => array(         // Webuser for the admin area (admin)
    'class'             => 'CWebUser',
    'loginUrl'          => array('/admin/site/login'),
    'stateKeyPrefix'    => 'admin_',
),

所以现在你有 2 个独立的用户组件:useradminUser. 您必须创建另一个AdminLoginFormAdminUserIdentity用于/admin/site/login进行身份验证。这应该很简单。

尽管您仍然有问题,但您无法accessRules在管理模块中轻松定义,因为它会使用该user组件来执行授权检查,而您希望它使用该adminUser组件。为了解决这个问题,您可以AdminModule像这样更改组件配置:

class AdminModule extends CWebModule
{
    public function beforeControllerAction($controller, $action)
    {
        if(parent::beforeControllerAction($controller,$action))
        {
            // Make 'adminUser' the main user in this module.
            // Frontend user is available as 'Yii::app()->frontendUser'.
            Yii::app()->setComponent('frontendUser', Yii::app()->user);
            Yii::app()->setComponent('user', Yii::app()->adminUser);
            return true;
        }
        else
            return false;
    }
}

现在您可以登录网站的 2 个不同部分,都使用不同的用户群进行身份验证。

于 2013-03-16T09:56:44.550 回答
0

The way I've solved my problem is something like @michael solution but with some difference. I've defined two different user component in my config file : user and customer :

 'user' => array(
            'loginUrl' => '/admin/default/login',
            // enable cookie-based authentication
            'allowAutoLogin' => true,
        ),
        'customer' => array(
            'class' => 'NWebUser',
            'loginUrl' => '/customer/signIn',
            // enable cookie-based authentication
            'allowAutoLogin' => true,
        ),

For customers I've defied an extended class from CWebUser named NWebUser. It's just an empty class. besides them I've defined another class which extend UserIdentity Calls CustomerIdentity in wich I've defined my customer authenticate method:

class CustomerIdentity extends CUserIdentity {

    private $_id;

    public function authenticate() {
        $record = Customer::model()->findByAttributes(array('email' => $this->username));
        if ($record === null) {
            $this->errorCode = self::ERROR_USERNAME_INVALID;
        } else if ($record->password !== Customer::hashPassword($this->password)) {
            $this->errorCode = self::ERROR_PASSWORD_INVALID;
        } else {
            $this->_id = $record->id;
            $this->errorCode = self::ERROR_NONE;
        }
        return !$this->errorCode;
    }

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

}

Now in my login method I just use this CustomerIdentity class :

public function login() {
        if ($this->_identity === null) {
            $this->_identity = new CustomerIdentity($this->username, $this->password);
            $this->_identity->authenticate();
        }
        if ($this->_identity->errorCode === CustomerIdentity::ERROR_NONE) {
            $duration = $this->rememberMe ? 3600 * 24 * 30 : 0; // 30 days
            Yii::app()->customer->login($this->_identity, $duration);
            return true;
        }
        else
            return false;
    }
于 2013-03-16T15:26:20.997 回答
0

就在这里。如果您有两个登录页面,则可以轻松使用两个CUserIdentity子类。然后,您的身份验证过程可能会非常不同。

如果您的登录页面需要对两组用户相同,则需要更多的参与。但这应该是可行的。

于 2013-03-15T23:28:08.363 回答