我是Yii的新手,我需要解决一些问题:有一些控制器有一些动作,如果用户试图加载一些动作,我需要检查他是否被授权;如果是,则执行一些操作,如果不是 - 重定向到登录页面。我该怎么做?我希望我不需要通过Yii :: user检查并在每个操作中手动重定向?提前致谢。
答案 0 :(得分:1)
使用操作过滤器,创建yii crud时会有基本的访问控制过滤器。以下是有关过滤器的文档:
http://www.yiiframework.com/doc/guide/1.1/en/basics.controller#filter
准备好访问控制解决方案的主题在这里:http://www.yiiframework.com/doc/guide/1.1/pl/topics.auth#sec-3
简而言之,在控制器中创建方法:
public function filters()
{
return array(
'accessControl',
);
}
然后使用方法定义操作的访问规则:
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('*'),
),
);
}
修改强>
如果用户未经过身份验证,要定义重定向的URL,请在用户组件中定义它:
'user' => [
'class' => 'CWebUser', // or custom
'allowAutoLogin' => true, // for autologin
'loginUrl' => ['/ua/user/login'], // if not authenticated go here
]
答案 1 :(得分:0)
我创建了AdminModule.php。在这里,我创建了一个函数来检查用户是否登录。还有公共页面,不需要登录。
public function beforeControllerAction($controller, $action)
{
if(parent::beforeControllerAction($controller, $action))
{
// this overwrites everything in the controller
$controller->layout = 'admin';
// this method is called before any module controller action is performed
// you may place customized code here
$route=$controller->id.'/'.$action->id;
$publicPages=array(
'user/login',
'default/error',
);
if($this->password!==false && Yii::app()->user->isGuest && !in_array($route,$publicPages))
Yii::app()->user->loginRequired();
else
return true;
}
else
return false;
}
答案 2 :(得分:0)
作为Mohit Bhansali示例的简化版本,我在AdminModule中实现了以下代码:
public function beforeControllerAction($controller, $action)
{
if(parent::beforeControllerAction($controller, $action)) {
if (Yii::app()->user->isGuest) {
Yii::app()->user->loginRequired();
} elseif (Yii::app()->user->id != 'myadminuser') {
throw new CHttpException(403, 'You are not authorized to perform this action.');
}
return true;
} else {
return false;
}
}
然后我还能够从每个管理模块控制器中删除accessControl数组返回的filters()(必须保持空的filter()函数),并完全删除accessRules()。例如,这是DefaultController:
class DefaultController extends Controller
{
public function filters()
{
}
public function actionIndex()
{
$this->render('index');
}
}
还值得一提的是,除了简单的访问控制之外,建议使用RBAC,如果我们在这里使用RBAC,我们将调用Yii :: app() - > user-> checkAccess()代替在AdminModule中检查Yii :: app() - > user-> id。
答案 3 :(得分:-1)
只需添加此
即可if(Yii::app()->user->getId()===null) {
// This is the case where user is not logged in so redirect
$this->redirect(array('site/login'));
} else {
// this is the case where user is logged in
// do your business
}
有一个非常好的SO帖子已经存在,你可以参考你的案例
How to authenticate user on index page in Yii
希望这有帮助