2011-08-08 16 views
1

我正在利用自定义的MY_Controller对我的Codeigniter网站上的用户进行身份验证。Codeigniter:有效地使用自定义MY_Controller进行用户身份验证 - 将变量传递给模型等

我利用$this->load->vars($data);,使我可以访问视图中的用户信息。

我的第一个问题是,$this->load->vars($data);允许在模型中访问,如果是这样 - 我找不到任何信息。如果没有,我怎么能让我的登录用户名到我的模型,而不必每次都通过控制器传递它?

其次......如果用户没有登录,我重定向他们redirect(base_url() . 'account/login');

这只是因为我的账户控制器还延伸MY_Controller,它就会陷入无限重定向循环的伟大工程。我可以不扩展这个页面的自定义控制器,但我看不到为什么登录用户不应该仍然能够看到登录页面..任何想法?

最后..如果用户登录,我的意见中定义了$user['username']。 如果用户未登录,则未定义。

因此,如果我在我的代码中有if($user['username']!=''){,当用户登录时,一切正常并且代码执行,但是当没有用户登录时弹出关于在if语句中使用的未定义变量的错误...

Codeigniter很难..

这里的工作是什么?

很多感谢!

回答

1

我同意Chris关于在会话中存储用户详细信息。

要检查用户是否已登录,您可以编写一个网守功能并将其放置在控制器结构中以保护控制器(并因此保护视图)。 有点像;

function gatekeeper() 
{ 
    if (!isset($this->session->item('username')) || !$this->session->item('username')) 
    { 
     redirect('/account/login); 
    } 
} 
+0

这实际上就是我所拥有的,除了在MY_Controller的构造中,所以它对于所有页面都是自动的。您是否说只需要在每个需要用户登录的控制器中复制它就简单了? Thx –

+0

如果它在您的MY_Controller中,那么将会为每个扩展MY_Controller的控制器调用它。如果这是你想要的,那就把它留在原来的位置。如果需要在选择的控制器上完成,则可以使网守成为辅助功能,并从单个控制器调用它。 – Rooneyl

+0

或者,如果你想要功能来控制用户登录,组,是管理员等..你可以随时使用http://benedmunds.com/ion_auth/ – Rooneyl

1

我会考虑将当前登录用户的userdata存储在会话中,以便您不需要查询它并每次将它传递给视图。您可以通过$this->session->userdata('your_userdata_var_name');访问控制器,视图和模型中的会话数据。

原因$user['username']显示错误可能是因为它被完全删除,未设置为空字符串(''),在这种情况下您正尝试访问未定义的数组键。

+0

当用户登录时,我对它们进行身份验证,并设置会话变量'logged_in'。由于用户拥有大量与他们相关的数据,但是更容易将其作为会话。更进一步,在会话中存储所有用户信息会带来什么安全隐患 - 用户可以举例改变数据? 嗯..是的 - 我想象的是这种情况..但如果用户没有登录 - 我不想要$ user ['用户名']被设置 - 即点...但isset()返回相同错误.. –

+0

我想这是一个偏好问题。我希望在会话中保留这些内容,这样我就不会在每个页面请求上运行额外的查询,并且如果使用数据库存储会话信息,他们将无法更新任何内容。我不会在会话中存储用户的所有信息,但我知道的任何信息都会定期处理(即用户ID,用户名,全名等)。 –

相关问题