Yii - 登录后如何防止用户访问登录页面

时间:2014-03-28 07:00:17

标签: php yii

大家。 我想阻止用户在登录后访问登录页面。 最好的方法是什么? 这是config / main / php

的代码
return array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name'=>'My Web',
'defaultController' => 'site/login')

和SiteContoller.php

public function actionLogin()
{
    $model=new LoginForm;

    // if it is ajax validation request
    if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
    {
        echo CActiveForm::validate($model);
        Yii::app()->end();
    }

    // collect user input data
    if(isset($_POST['LoginForm']))
    {
        $model->attributes=$_POST['LoginForm'];
        // validate user input and redirect to the previous page if valid
        if($model->validate() && $model->login()){
            $isAdmin = Yii::app()->user->getLevel() <=1; // or how you define admin in your case.
            if ($isAdmin)
                $this->redirect(array('user/view', 'id'=>Yii::app()->user->id));
            else
            //$id = Yii::app()->user->id;
                $this->redirect(array('site/index'));
        }
    }
    // display the login form
    $this->render('login',array('model'=>$model));
}

'defaultController'=>'site/login'我还希望用户在关闭浏览器并重新打开后不访问登录页面。那可能吗?非常感谢

3 个答案:

答案 0 :(得分:2)

你可以尝试这种方式,简单。

public function actionLogin()
{

   if(!Yii::app()->user->isGuest)
   {
       $this->redirect(array('index')); 
   }

   // rest of the codebelow.

}

答案 1 :(得分:1)

您可以定义访问规则并添加不同类型用户访问的URL。 例如:

class YourController extends Controller {

public function filters() {
    return array(
        'accessControl', // perform access control for CRUD operations
    );
}

/**
 * Specifies the access control rules.
 * This method is used by the 'accessControl' filter.
 * @return array access control rules
 */
public function accessRules() {
    return array(
        array('allow', // allow all users to perform 'index' and 'view' actions
            'actions' => array('index', 'view'),
            'users' => array('*'),
        ),
        array('allow', // allow Only logged in user's to delete and update
            'actions' => array('delete', 'update'),
            'users' => array('*'),
        ),
        array('deny', // deny all users
            'users' => array('*'),
        ),
    );
}

这是在Yii中使用的最好,最简单和最合适的方法..

答案 2 :(得分:0)

使用Sessions可以实现这一点。您要做的是启动运行在代码顶部的会话。如果您曾引用过登录或未登录的用户,则可能需要在代码的其他部分中包含此内容。

$sid = $session_id();
if(isset($sid)){
    //session exists
} else {
    start_session();
}

在此之后,您将需要添加会话条目以跟踪您是否有登录用户。我建议您在确认用户已登录后执行此操作:

// collect user input data
    if(isset($_POST['LoginForm']))
    {
        $model->attributes=$_POST['LoginForm'];
        // validate user input and redirect to the previous page if valid
        if($model->validate() && $model->login()){
            // store that the user is logged in
            $this->session->set_userdata(array('loggedIn' => true));
            $isAdmin = Yii::app()->user->getLevel() <=1; // or how you define admin in your case.
            if ($isAdmin)
                $this->redirect(array('user/view', 'id'=>Yii::app()->user->id));
            else
            //$id = Yii::app()->user->id;
                $this->redirect(array('site/index'));
        }
    }

最后,您可以在进入表单处理之前检查代码,看看是否有人使用会话变量登录。如果是,您可以将它们发送到站点/索引或用户/视图,否则继续保持原样。

if(isset($this->session->userdata('loggedIn')){
    //user is logged in, redirect away from this page
}
// else the user is not logged in and continue as normal

理想情况下,您可以使用以上三行加上session_start()代码来检查用户是否在任何页面上登录,这通常是实现私人/公共页面的好​​方法,同时也让人们关闭浏览器/页面,然后返回而不会被注销。

相关问题