2012-03-03 73 views
0

当用户登录或当他注册,他的$_SESSION['username']得到他的用户名的值。我想让他们只有在注册时才能访问某些控制器。但我不喜欢写这个的想法:在每个控制器我不想unloggined人们看到如果用户登录或不笨

function __construct() 
{ 
    session_start(); 
    if(empty($_SESSION['username'])) 
    die(); 

    parent::__construct(); 
} 

。有没有更好的方法来做到这一点?谢谢。

回答

4

你可能会考虑延长你的控制器基类(见the Codeigniter Wiki Article on extending the class)提供require_login功能:

class MY_Controller extends CI_Controller { 

    protected function require_login() { 
    if(empty($_SESSION['username'])) 
     die(); 
    } 
    } 

一旦你有了这个,你可以调用require_login()在要保护每个控制器的构造函数:

function __construct() { 
    $this->require_login(); 
} 

最后,而不是使用PHP的超全局$_SESSION会话存储,你可能会考虑采取笨的优势10库或an equivalent

+0

很酷,我喜欢这个解决方案。 – 2012-03-03 18:20:24

+0

不要忘记调用'parent :: __ construct()'。 – hakre 2012-03-03 18:22:04

+0

@hakre谢谢,很好的电话! – rjz 2012-03-03 18:24:19

1

笨有它的own session, not $_SESSION

除此之外,如果你有控制器是同一类型的,你可以写一个基本的控制器,并从其扩展。基本控制器可能包含验证控制器是否可访问的代码,并且不需要在您创建的每个控制器类中编写该代码。见How do I extend the code igniter controller class?

+0

'笨都有它自己的会话,而不是$ _SESSION.' - 他们做的是COOKIE,我需要会话,因为那时人可以通过cookie更改他们的用户名并登录到任何帐户。 – 2012-03-03 18:18:59

+0

这只是说。有时候问题会在这里出现,询问的人不知道这一点。你*可以*使用'$ _SESSION',因为这是PHP。同样适用于['extends'](http://de.php.net/manual/en/keyword.extends.php)。 – hakre 2012-03-03 18:21:08

+0

有可能使用本地会话超过笨的'session'库的一些原因,但@ hakre是正确的 - 最CI是有原因的书面,这是很好的利用它,你可以。查看http://codeigniter.com/wiki/Native_session获得一个很好的本地会话包装 – rjz 2012-03-03 18:22:23

1

功能__construct(){

parent::Controller(); 
$this->authenticate(); 

}

function authenticate() 
{ 
    if (!$this->session->userdata('admin_loggedIn')) 
    { 
    redirect('login'); 
    } 
}