在使用PHP注销后阻止用户访问先前(受限制)的页面

时间:2014-09-27 01:55:24

标签: php caching logout

当用户决定退出时,他们显然会使用“退出”按钮执行此操作 当他们这样做时,执行这个脚本:

if(isset($_POST['submit_Logout'])){
    $_SESSION['backend']->logout();  //  see this function bellow
    unset($_SESSION['user']);  //  unset only this session since there are other sessions I'd like to keep
    session_regenerate_id(true);  //  makes sure the session id is updated, and the old one is discarded
    KD::notice('success',$success_LoggedOut);  //  adding a notice to another session
    KD::redirect('/');  //  redirecting the user using header();
    session_commit();
}

我只是取消了这个特定的会话(user),因为还有其他会话可以保存其他数据,无论用户是否登录,都可以改善用户体验。

logout() - 函数看起来像这样 - 现在:

public function logout(){
    $this->accessible=false;  //  just a flag to check against (see bellow)
    $this->username='';  //  empty the username
}

由于我没有设置保存相关用户数据的会话,我才意识到这个功能可能是不必要的。或者将未设置的部分等移动到函数中..

无论如何,我已经体验过,当用户退出时,他/她或其他人有机会在浏览器中点击后退按钮,瞧,他们可以查看网页。当然,如果他们开始点击任何链接,他们就会被抛弃。但是后退按钮仍然可用..

我认为这是由浏览器缓存的页面/视图引起的。因此,当他们点击后退按钮时,他们会看到存储在浏览器内存中的缓存页面/视图等等。

由于此页面或视图通过带有永久<head>的index.php页面加载到我的模板中,因此我无法对这些受限制的页面/视图进行缓存。或者有吗?

无法从浏览器历史记录中删除记录?或阻止这些页面首先被记录?

点是。我相信,我需要做的是强制浏览器始终从服务器请求页面。因此,无论用户点击后退按钮还是指向受限页面的链接,该页面都应该始终从服务器请求它,而不是浏览器内存..

或者我没有说明这一点?

如果是这样的话。我真的好奇。这通常是怎么做的?

我在班上有这个

private $accessible = false;  //  when logged in, this is set to true
public function accessible(){
    return $this->accessible;
}

在包含限制区域视图的页面顶部,我有这个:

if($_SESSION['user']->accessible()===true):

通过登录屏幕提示用户提示用户 但这并不像预期的那样奏效。当用户在浏览器中使用后退按钮时,不会执行此检查...

提前致谢..

更新
下面简要介绍一下我的结构/布局:

/*  
    when the user is logged in/out, the script that does that is executed up here. 
    That includes setting the sessions etc. aswell - which means, if the user is not logged in, the access will be set to false.
*/
<head>

</head>
<body>
    /*  
        Here I include different pages with php include;  
        These pages can be home.pg.php, contact.pg.php, and of course restricted.pg.php
        each of these pages includes different content (views as I like to call them) that is presented to the user based on their interaction.

        Now. When the user tries to access the restricted.pg.php, I have this at the top:
    */
       if($_SESSION['user']->accessible()===true):
           /*  now each view that is included here should be not accessable if accessable() is not true.  */
       else:
           /*  the user is presented with a login form  */
       endif;
</body>

这有帮助吗?

2 个答案:

答案 0 :(得分:1)

需要登录的所有网页都应该有这样的内容,

session_start();
if(!isset($_SESSION['user']){
  //REDIRECT USER TO LOGIN PAGE
}

如果由于浏览器缓存问题而导致您回到页面的缓存版本(即使用户已注销),那么您应该将用户重定向两次(良好做法)。

我的意思是创建一个名为logout.php的文件,这样当用户点击注销按钮时,它会将用户重定向到logout.php(该会话未设置会话代码),然后将用户重定向到登录页面。< / p>

so current page ----redirects to---> logout.php ----redirects to----> login.php

答案 1 :(得分:0)

我认为在每个页面中您都可以检查是否设置了会话。恩。 Session::handlelogin('user')

然后你可以在Session类中创建一个函数即handlelogin

Class Session {

function handlelogin($user) {
  if (!isset($user)) {
     //redirect the user to your login page
  }
}

}

注意:如果您使用的是MVC架构,那么只需将其设置在页面顶部,然后就可以在Controller中进行设置

Session::handlelogin('user')