2010-12-05 33 views
1

我想使某些操作仅适用于已登录的用户。 我试图限制某些这段代码:限制一些动作,_remap函数,CodeIgniter

function _remap($method) 
    { 
     $restricted = array('update_rating', 'delete_post'); 
     if(! $this->session->userdata('logged_in') && in_array($method, $restricted)) 
     { 
      echo 'Log in, please'; 
     } 
     else { 
      $this->$method(); 
     } 
    } 

但是这$ - > $()方法,并没有收到这是在URL中发送的参数。该怎么办? 我想仅为登录用户提供一些动作。

+0

`_remap`是一个特殊的函数从URL修改调用函数...如果要限制通过URL访问功能,则必须追加下划线`_foo($瓦尔)` - 这可以只能在你的控制器中调用(不通过url)。澄清也许?否则您的代码看起来不错。在上面,无论调用什么函数,`_remap`都会根据您的条件比较请求并尝试调用它。 – Ross 2010-12-05 19:47:26

+0

不,我想让一些功能只允许记录用户。 – Kir 2010-12-05 20:12:29

回答

2

要限制登录的用户为整个控制器使用类似:

function __construct(){ 

    if(!is_logged_in){ 
    redirect('user/login'); 
    } 

} 

还是做同样的,如果你需要限制的具体方法:

function restricted_function(){ 

    if(!is_logged_in){ 
    redirect('user/login'); 
    } 

} 

这要求您在调用控制器之前设置了is_logged_in变量。

我使用一个MY_controller来检查所有控制器继承的登录会话。

1

您没有向它发送任何参数。

您应该提供所有需要$方法进行评估的参数。

function _remap($method) 
{ 
    $restricted = array('update_rating', 'delete_post'); 
    if(! $this->session->userdata('logged_in') && in_array($method, $restricted)) 
    { 
     echo 'Log in, please'; 
    } 
    else 
    { 
     $params = get_func_get_args(); 
     $this->$method($params); 
    } 
} 

请注意,方法现在将接收和参数的数组。

2

理想情况下,您不应该使用这种开发模式来创建用户登录。您应该简单地在您调用的类的构造函数中进行检查,然后使用$ this-> router->方法来查看用户尝试访问的方法。检查需要登录的方法数组,然后检查用户是否登录。如果其中一个条件为false,则重定向至登录页面,否则继续执行呼叫。示例实现如下:

Class XYZ extends Controller{ 

    function __construct() { 
     parent::controller(); 
     $protected_methods = array('method_1', 'method_2'); 

     if(in_array($this->router->method, $protected_methods)){ 
      // check if user is logged in 
      if(!$this->session->userdata('logged_in')) 
       redirect('/login'); 
     } 
    } 

}