我正在尝试取消设置我当前登录用户的会话。如果我正常登录但工作正常,但是当我使用时记住我使用cookie设置它不会被破坏。
我设置会话和cookie的代码是
public function login() {
if(isset($this->session->userdata['username']) || isset($_COOKIE['user_id'])){
$this->load->model('User');
$p_uid = $this->User->user_login($_COOKIE['user_id'], $_COOKIE['password']);
redirect(base_url() . "dashboard");
}else{
$this->form_validation->set_rules('user_id', 'User ID', 'required');
$this->form_validation->set_rules('password', 'Password', 'required');
if ($this->form_validation->run() == FALSE) {
$this->load->view('login/login');
} else {
$user_id = $this->input->post('user_id');
$password = $this->input->post('password');
$this->load->model('User');
$p_uid = $this->User->user_login($user_id, $password);
//var_dump($p_uid);
if ($p_uid) {
if(isset($_POST['remember_me'])){
setcookie("user_id",$user_id,time()+86400*30);
setcookie("password",$password,time()+86400*30);
}
redirect(base_url() . "dashboard/");
} else {
$data=array(
"error"=>"Wrong Userid Or Password"
);
$this->load->view('login/login',$data);
}
}
}
}
我的退出功能是:
public function logout(){
$this->load->helper('cookie');
delete_cookie("user_id");
delete_cookie("password");
$this->session->unset_userdata("username");
$this->session->sess_destroy();
redirect(base_url());
}
我在做错的地方。请帮忙。感谢
答案 0 :(得分:3)
首先,你的记忆机制存在严重缺陷。请参阅Implementing Secure User Authentication in PHP Applications with Long-Term Persistence。
我不了解您的登录信息。您正在检查会话中是否设置了username
,然后使用cookie来执行登录。我猜你已经使它工作,||
的第一部分总是失败,因为永远不会设置$this->session->userdata['username']
。从会话中访问username
的正确方法是:
$_SESSION['username']
OR
$this->session->userdata('username')
OR
$this->session->username
最后,通过在网络标签中检查您的请求,确保实际删除了Cookie。 Codeigniter通过设置大约一天的负过期时间来删除cookie,看看您的Codeigniter版本是否属于这种情况。为了获得最佳效果,只需使用较长的负过期时间再次设置Cookie,而不是检查Cookie是否已设置,请检查Cookie是否为!empty
。
答案 1 :(得分:1)
要从会话数组中取消设置单个元素:
$这 - >会话而> unset_userdata( 'some_name');
您可以传递一组键来取消设置多个值:
$ array_items = array('username'=>'','email'=>''); $这 - >会话而> unset_userdata($ array_items);
答案 2 :(得分:1)
public function check_admin_login()
{
$admin_email_address=$this->input->post('admin_email_address',true);
$admin_password=$this->input->post('admin_password',true);
$this->load->model('admin_model','a_model');
$result= $this->a_model->check_admin_login_info($admin_email_address,$admin_password);
// echo '<pre>';
// print_r($result);
// exit();
$sdata=array();
if($result)
{
$sdata['full_name']=$result->admin_full_name;
$sdata['admin_id']=$result->admin_id;
$this->session->set_userdata($sdata);
//$sdata[]
redirect('super_admin');
}
else{
$sdata['message']='Your User Id / Password Invalide !';
$this->session->set_userdata($sdata);
$this->load->view('admin/admin_login');
}
}
for login and for logout
public function logout()
{
$this->session->unset_userdata('full_name');
$this->session->unset_userdata('admin_id');
$sdata=array();
$sdata['message']='You are Successfully Logout !';
$this->session->set_userdata($sdata);
redirect('admin');
}
答案 3 :(得分:1)
我前段时间遇到过同样的问题。我正在尝试所有可行的方法。但我失败了。最后,我找到了ob_start
和ob_clean
的解决方案。注销应该是这样的:
class controllerName extends CI_Controller
{
function __construct()
{
parent::__construct();
ob_start();
$this->load->library('Session');
$this->load->helper('cookie');
}
public function logout()
{
$this->load->driver('cache');
$user_id = array(
'name' => 'user_id',
'value' => '',
'expire' => '0',
'domain' => '.localhost',
'prefix' => ''
);
delete_cookie($user_id);
$this->session->sess_destroy();
$this->cache->clean();
ob_clean();
redirect(base_url());
}
}
要阻止浏览器返回按钮上一页加载,您应该执行类似这样的操作
$sess = $this->session->userdata('username');
if(empty($sess))
{
$this->session->set_flashdata('error', 'Session has Expired. Please login');
redirect('loginController/method');
}
else
{
# success.
# continue the normal code here
}
仅供参考:这应该添加到每个函数中或由
constructor
用来执行此操作。注意:请勿在Cookie中添加密码。 Read - php cookie injection vulnerability?
答案 4 :(得分:1)
这将在http或localhost中的登录页面,然后codeigniter为http或locahost创建会话时发生。 当我们尝试在https://www.example.com或http://[::1]/中获取会话时,则不会为这些类型的网址添加会话。
尝试在网站中使用一种类型的网址格式
答案 5 :(得分:0)
删除cookie
delete_cookie('name', $domain, $path);
删除/销毁塞语
$这 - &GT;会话而&GT; sess_destroy();
销毁特定会话
$this->session->unset_userdata('name');
对于多个项目
$items = array('item-name1' => '', 'item-name2' => '');
$this->session->unset_userdata($items);