如何使用会话限制对控制器功能的访问 - CodeIgniter

时间:2013-12-08 22:39:48

标签: codeigniter session authentication authorization

我做了一个应用程序,其中有两个控制器(用户和家庭)。用户控制器执行诸如注册用户和将其登录/注销等操作,而家庭控制器用于在用户通过身份验证后执行操作。

我在SO上找到了这个答案:What is the best practice for restricting specific pages to logged in users only in Codeigniter?

但是我看到验证会话值是在一个单独的自定义控制器中执行的。我想知道为什么这是必要的?

在我的家庭控制器中,我有一个功能,可以检查项目的会话值是否设置为true并允许用户使用家庭控制器中提供的功能,否则将它们重定向回用户控制器索引方法,用于加载登录视图。在家庭控制器的构造函数中调用此函数,如下所示:

public function __construct()
    {
        parent::__construct();
        $this->is_loggedIn();
    }
public function is_loggedIn()
    {
        $check_login = $this->session->userdata('isLoggedIn');

        if(!isset($check_login) || $check_login != 1)
        {
            redirect('user');
        }
    }

这很有效;除非经过身份验证,否则不允许用户访问家庭控制器中的页面/功能。

但是,我的用户控制器中的功能不是这种情况。如果我登录然后注销,我仍然可以访问用户控制器中的一个功能,即localhost / sitename / user / register,即使我已经注销并且不能访问这些功能。他们应该重定向到登录页面(用户控制器索引方法),而是允许用户继续使用用户控制器中的功能。

我尝试在用户控制器中包含上面的is_loggedin()函数来检查用户会话是否有效并从用户控制器构造函数调用该函数,但我最终得到了一个重定向循环(理所当然)。

所以我想知道如何在用户未经过身份验证时禁止访问用户控制器功能。

我想到的另一种方法是在用户控制器的每个函数中包含is_loggedin()函数,但我想知道是否有更简洁的方法来执行此操作。现在这是我的临时修复。如果有更多OOP友好的方式,请告诉我

1 个答案:

答案 0 :(得分:0)

您应该只检查会话是否= FALSE。

public function __construct()
    {
        parent::__construct();
        $this->is_loggedIn();
    }
public function is_loggedIn()
    {
        $check_login = $this->session->userdata('isLoggedIn');

        if($check_login === FALSE)
        {
            redirect('user');
        }
    }

请务必在用户退出时删除isLoggedIn。

   $this->session->unset_userdata('isLoggedIn');