2014-04-02 163 views
0

我正面临一个非常奇怪的问题,我正在做我的应用程序中的CasLogin .. 我已经成功实施CAS,即所有值都设置$ _SESSION变量经过所有适当的验证,并成功登录,但是当我重定向它从CasLogin()动作索引动作$ _SESSION不包含任何内容。 我正在使用Yii Frame Work。重定向后PHP会话被破坏?

这里是代码。

public function actionCasLogin($CID=NULL) 
{ 
    //code to be imported from GMS here 
    PhpCasControl::setPhpCasContext($CID); 
    phpCAS::setPostAuthenticateCallback(array($this,'_saveServiceTkt')); 
    $loginForm = new CasLoginForm; 
    // validate user input and redirect to the previous page if valid 

    if ($loginForm->login($CID)) { 

     if (Yii::app()->user->isGuest){ 
      echo '<br> <br> This shows up..'; 
      var_dump($_SESSION); 
     } 
     else{ 
      echo 'Hello at caslogin <br>never shows up'; 
      var_dump(Yii::app()->user->id); 
     } 


     $this->redirect(array('index')); 

    } 
    else { 
     throw new Exception("You don't have sufficient permissions to access this service. Please contact Administrator !"); 
    } 
} 

此功能正常工作,如果我把EXIT; 这里会显示$ _SESSION与所有需要的值.. 但转接后...索引.. 其代码是这个..

public function actionIndex() 
{ 
    echo"hello at index"; 

    if (! Yii::app()->user->isGuest) { 
     //#CASE 1: User is already logged in 

     $this->redirect(array("site/upload")); 
    } 
    else{ 
     //#CASE 2: User is not Logged in 
     echo '<br>shows up with empty session<br>'; 
     var_dump($_SESSION); 
     var_dump(Yii::getVersion()); 
     exit; 
     $this->redirect(array("site/login")); 
    } 

} 

这里$ _SESSION是空..

任何解释为什么这可能会发生.. 我知道CAS创建自己的会话服务票名..我已经处理了这件事..通过RenameSession函数,我在CasLoginForm中调用.. 其代码是这..

public function rename_session($newSessionId) { 
    //Store current session variables so that can be used later 
    $old_session = $_SESSION; 
    //Destroy current session 
    session_destroy(); 
    // set up a new session, of name based on the ticket 
    $session_id = preg_replace('/[^a-zA-Z0-9\-]/', '', $newSessionId); 
    //start session with session ID as 1) service ticket in case of CAS login, 2) random sTring in case of local login. 
    session_id($session_id); 
    session_start(); 

    //echo "<br>new session <br>"; 

    //Restore old session variables 
    $_SESSION = $old_session; 
    //var_dump($_SESSION); 
} 
+0

为什么您需要更改会话ID? – Dinistro

+0

Yii创建自己的会话,并且CAS与服务票证ID进行会话,以使两者指向同一个会话。我必须改变身份证。 – Himanshu97

+0

但我仍然无法解释,为什么您需要重置session_id,难道您不能只将您的cas-id添加为会话值吗? – Dinistro

回答

0

好的,我认为你应该使用session_id来改变id。

public function rename_session($newSessionId) { 
    // set up a new session id, of name based on the ticket 
    session_id(preg_replace('/[^a-zA-Z0-9\-]/', '', $newSessionId)); 
} 
+0

居然,这没有帮助..!不知道为什么,但必须在每个页面中放置一个session_start()...!甚至连会话持续时间和自动启动会话配置都不起作用 – Himanshu97

+0

您通常在每个页面中使用'session_start()'。但是这应该是在开始而不是在功能上。如果您使用的是masterpaging,则可以将其放入index.php文件中。 – Dinistro