2011-08-21 131 views
0

我將如何創建一個包含查詢字符串與當前頁面CakePHP的頁面上的登錄鏈接,例如:domain.com/login/?back=/posts/This_is_a_post登錄鏈接

和那麼我將如何在login方法中使用此方法將用戶BACK發送到此URL?

我已經試過這樣:<?php echo $this->Html->link('Log in', array('controller'=>'users','action'=>'login','admin'=>false, '?'=> array('back'=>$this->here)), array('escape'=>false)); ?>

,但它這樣做的URL /login?back=%2Fportfolio%2Fgt%2FCreatHive

我怎麼得到它不改變/在URL

乾杯

回答

0

做到這一點,最好的辦法是在會話中訪問的最後一個頁面存儲在某些時候,可能當頁面加載到login動作或其他東西時。你爲什麼問?由於受到攻擊可能會鏈接到您的網站,例如:yoursite.com/login?back=mysite.com/login,因此當用戶登錄時,您會將它們發送到我的網站,該網站與您的登錄表單完全相同,並讓他們再次登錄。瞧,攻擊者現在可以輕鬆地釣魚您的用戶信息。

有了會話,也不會有網址編碼問題。就像這樣在你的login行動:

$this->Session->set('back_to', $this->referer()); 

// Then if they have logged in: 
$backTo = $this->Session->read('back_to'); 
if($backTo) { 
    $this->redirect($back_to); 
} else { 
    $this->redirect($this->Auth->redirect()); 
} 
0

更新 - 嘗試使用命名參數代替:

對於您的鏈接:

echo $this->Html->link('My Link', array('controller' => 'users', 'action' => 'login', 'url' => $url)); 

在用戶登錄:

function login(){ 
    if($this->Session->read('Auth.User')){ 
     $url = $this->params['named']['url'] 
     // encode/decode url 
     $this->redirect("$url"); 
    } 
} 

您可以隨時使用進行urlencode()和urldecode()爲$ url變量中。

您還需要確保你的表格也發送URL回到登錄功能:

echo $this->Form->create('User', array('controller' => 'users', 'action' => 'login', 'url' => $url)); 
+0

您好我沒有問如何創建一個登錄表單。我問如何用查詢字符串創建一個鏈接:) – Cameron

+0

對不起,誤讀了這個問題!希望它現在有所幫助! –

+0

我只是得到鏈接,但沒有查詢字符串? – Cameron