我已经开发了一个使用codeigniter的登录,但我有这个问题,当登录时,任何人都可以在另一个地址键入另一个地址,并转到另一个帐户。如何避免这种情况?请指点我?
这是我对登录进行编码的方式:
function index()
{
$this->is_logged_in();
}
function is_logged_in(){
$is_logged_in = $this->session->userdata('is_logged_in');
if(!isset($is_logged_in)||$is_logged_in!= TRUE ){
echo 'you are not logged in ';
echo anchor('login_controller','Login');
}else{
$this->main();
}
}发布于 2010-11-10 17:59:57
我在CI中使用了两种用户身份验证方法
您可以通过__construct()函数按页执行此操作,检查用户是否已登录,然后相应地对其进行重定向。
或者,您可以扩展基本控制器,以便(例如)拥有一个常规控制器,用于不需要身份验证的页面,一个“公共”控制器,它要求您登录,以及一个“管理”控制器,它只允许特定类型的用户。
我再一次向Phil Sturgeon提及这一点- extending base controllers
我也推荐你看看一些Auth库-- Ion Auth和Tank Auth被普遍认为是非常好的--但也有很多可用的。
你的功能也是相当有限的--用户只能做一个选项(main)。
更好的方法是
<?php
class Foo extends Controller {
function __construct()
{
$is_logged_in = $this->session->userdata('is_logged_in');
if(!isset($is_logged_in)||$is_logged_in!= TRUE )
{
redirect('login');
}
}
// else, logged in..proceed
}例如。
发布于 2010-11-10 15:52:04
你必须在用户登录后创建一个会话,例如指定正确的凭据。一旦你这样做了,你将不得不在每个页面上进行会话检查,这些页面只需要由登录的用户查看。
有关更多信息,请查看CI的Session Class。
发布于 2010-11-11 18:23:17
你说过:
我在登录时遇到此问题,任何人都可以在另一个地址中键入另一个地址,然后转到另一个帐户
据我所知,当您验证用户的凭据时,您不会在您的会话中存储该用户的ID。
您需要在每个会话中存储ID,以便知道谁正在查看每个页面以及您需要向他显示什么。
控制器示例:
function validate_credentials() {
$this->load->model('users_model');
if($this->users_model->check_pass() == true) {
$data = array(
'email' => $this->input->post('email'),
'is_logged_in' => true,
'user_id' => $this->users_model->get_userid()
);
$this->session->set_userdata($data);
}
}模型示例:
function get_userid() {
$this->db->where('email', $this->input->post('email'));
$q = $this->db->get('users');
$r = $q->row();
return $r->id;
}现在,您可以基于$this->session->userdata(‘user_id’)动态加载内容,并确定他们应该在每个页面上看到什么。
PS:如果你想拥有角色,你只需要在你的会话中存储用户角色,添加另一个'key‘=> 'val’
希望这能有所帮助。
https://stackoverflow.com/questions/4142246
复制相似问题