我的 yii 应用程序中的登录过程有问题。我有两种不同类型的用户,包括管理站点和客户的管理员用户。我正在使用CwebUser
和UserIdentitiy
管理这两个组的登录。但我的问题是,当客户登录网站时,他也可以访问管理页面。我想做的是说应用程序为他们创建两个不同的身份会话。我不想使用访问控制规则之类的东西。有什么方法可以用 Yii 风格为他们创建不同的会话吗?
3 回答
如果您不想像其中一条评论中建议的那样使用复杂的 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 个独立的用户组件:user
和adminUser
. 您必须创建另一个AdminLoginForm
并AdminUserIdentity
用于/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 个不同部分,都使用不同的用户群进行身份验证。
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;
}
就在这里。如果您有两个登录页面,则可以轻松使用两个CUserIdentity
子类。然后,您的身份验证过程可能会非常不同。
如果您的登录页面需要对两组用户相同,则需要更多的参与。但这应该是可行的。