我正在使用Yii开发一个web。
当我使用gii代码生成器创建模块时,它会自动将身份验证添加到特定模型和控制器的管理页面。
但是我想在索引页本身添加用户身份验证。因此,当用户打开网站时,它应该要求登录。
index.php在"view'site'"目录下,login.php也在同一目录下。
我有 sitcontroller .php在"'controller"目录(通常)
这是我在Yii框架中的第一个项目。有人建议我如何应用用户身份验证,当网站打开。
只需在SiteController的index()动作的顶部添加以下内容:
if(Yii::app()->user->getId()===null)
$this->redirect(array('site/login'));
它将检查用户是否已登录。如果不是这样,页面将重定向到login。
为了避免未登录的用户访问任何操作,您需要修改控制器的accessRules()函数:
public function accessRules()
{
return array(
array('allow',
'actions'=>array(),
'users'=>array('*'),
),
array('allow',
'actions'=>array(),
'users'=>array('@'),
),
array('allow',
'actions'=>array(),
'users'=>array('admin'),
),
array('deny',
'actions'=>array(),
'users'=>array('*'),
),
);
}
在每个控制器中,我们都有这个函数,在它里面我们有四个数组。每个数组声明一个访问规则。在"actions"参数中,我们指定哪些操作将影响该访问规则,在"users"参数中,我们指定哪些用户将被允许访问这些操作。"*"表示所有用户,无论是已验证的还是未验证的。"@"表示仅通过身份验证的用户,"admin"当然表示仅管理员成员。
如果任何'actions'参数没有分配实际操作,则只需删除该行:
array('allow',
'users'=>array('admin'),
),
好了,我终于完成了。
下面是代码,我已经添加到 sitcontroller .phppublic function filters()
{
return array(
'accessControl',
);
}
public function accessRules()
{
return array(
array('allow', // allow all users to perform only 'login' action
'actions'=>array('login'),
'users'=>array('*'),
),
array('allow', // allow admin user to perform 'admin' AND 'delete' AND 'index' actions
'actions'=>array('admin','delete','index'),
'users'=>array('admin'),
),
array('deny', // deny all users
'users'=>array('*'),
),
);
}
所以,它现在工作了。
感谢大家的宝贵回复
这与上面的相同,但作为一个组件,所以它只需要完成一次,所有需要安全的控制器都可以扩展这个组件。
在components目录(SecurityController.php
)中添加一个新组件:
<?php
class SecurityController extends CController {
public $breadcrumbs=array();
public function filters()
{
return array(
'accessControl',
);
}
public function accessRules()
{
return array(
array('allow',
//'actions'=>array('admin','delete','index'),
'users'=>array('admin', '@'),
),
array('deny', // deny all users
'users'=>array('*'),
),
);
}
}
现在确保所有需要身份验证的控制器都继承自SecurityController
:
<?php
class JSController extends SecurityController {
尝试在Yii中强制登录所有页面:
http://www.larryullman.com/2010/07/20/forcing-login-for-all-pages-in-yii/对于索引页的强制登录,您可以自定义
public function handleBeginRequest($event)
{
if (Yii::app()->user->isGuest && !in_array($_GET['r'],array('site/login'))) {
Yii::app()->user->loginRequired();
}
}
你可以查看这个帖子
专题-认证与授权
Yii维基
查看示例博客应用程序的post控制器
关于SecurityController组件的建议:
类SecurityController扩展CController
可能是因为更新的版本:我必须从Controller扩展SecurityController以使其工作。但这是一种魅力