2011-04-03 149 views
2

我正試圖找到一種方法來登錄用戶沒有密碼。如何:CakePHP無密碼登錄?

原因是我在我的網站phpBB3論壇和用戶已經登錄在那裏。因此,我現在正在構建一個擴展到網站,不僅僅是論壇(使用CakePHP)。我認爲當用戶爲論壇創建一個帳戶時(當然還有現有用戶的其他鏈接),我可以將自動帳戶創建附加到CakePHP。因此,用戶將獲得與他們在論壇中註冊的用戶名相同的CakePHP帳戶。這意味着註冊CakePHP部分網站的唯一方法就是先註冊到論壇。

現在我想通過phpBB3登錄來處理整個日誌記錄事件,以便用戶仍然可以登錄到論壇,然後附上一段代碼,該代碼還會使用用戶名登錄到CakePHP網站的一部分他們曾經登錄論壇。

通過這種方式,我也可以通過在論壇中的狀態將用戶置於自己的ACL組中。

這就是我所追求的,我需要知道如何以這種方式登錄用戶。 我不是在尋找完整的代碼我只是在尋找一個答案,解釋瞭如何在CakePHP中登錄用戶,而不需要他們擁有密碼。

我也看了http://bakery.cakephp.org/articles/wilsonsheldon/2009/01/13/phpbb3-api-bridge但它只是不相當是什麼我正在尋找...

回答

7

據我記得,Auth需要兩個信息登錄。 您可以通過auth來更改用戶表中的哪些字段。

$Auth->fields = array(
    'username' => 'username', 
    'password' => 'password' 
); 

所以,如果你要能夠根據自己的暱稱和shoesize登錄用戶:

$Auth->fields = array(
    'username' => 'nickname', 
    'password' => 'shoesize' 
); 

重要:
的AuthComponent預計存儲在數據庫中的密碼值是散列而不是以明文存儲。
(我認爲這是密碼和Security.salt的SHA1)

在上面的例子中,如果任何條目已經存在於數據庫,你不得不重寫shoesize場爲他們每個人用哈希版本的鞋子。

要生成自己一個散列密碼,您可以使用$Auth->password('A Password');


快速和骯髒的

如果您填寫的密碼字段在用戶表的返回值: $Auth->password(null);

然後您可以使用以下:

​​

減快速和骯髒的


當創建一個新用戶。 將密碼字段設置爲某個隨機輸入的md5散列。

$this->authUser[$this->User->alias][$Auth->fields['password']] = $Auth->password(md5(rand().rand())); 

使用來自phpBB3的用戶名從數據庫用戶表中檢索相關記錄 。

$this->authUser = $this->User->findByUsername(USERNAME_FROM_PHPBB3); 

如果查詢成功登錄的用戶

if($this->authUser){ 
    if($Auth->login($this->authUser)){ 
     // Login Successful 
    } 
} 

+0

因此,註冊用戶的方式只是給他們隨機或任何密碼,然後登錄並不需要任何用戶密碼輸入,我可以直接登錄他們只用他們的用戶名?你知道我如何從會話數據中獲取PHPBB用戶名到CakePHP端嗎? – Pehmolelu 2011-04-04 13:15:45

0

從你的CakePHP應用程序,如果用戶在phpBB論壇表存在,您可以檢查,你可以使用phpbb會話來檢查用戶是否已登錄。

+0

是的,我會做這樣的事情,但我不得不在CakePHP中登錄該用戶,並且在CakePHP中管理該用戶的會話不是嗎?問題是我不知道如何。 – Pehmolelu 2011-04-03 20:40:05

+1

http://groups.google.com/group/cake-php/browse_thread/thread/a6fd496315109e62閱讀 – Mika 2011-04-03 20:56:22

+0

噢,如果你知道如何,那麼請告訴我如何從PHPBB會話中檢查我的CakePHP應用程序,如果用戶是登錄? - 編輯:對不起,最初並沒有注意到我們的鏈接帖子,謝謝:) – Pehmolelu 2011-04-04 13:17:18

0

此功能將解決你的問題:

public function forceLogin($userName = NULL) { 
    $this->_setDefaults(); 

    $this->User = ClassRegistry::init('User'); 
    $this->User->recursive = 0; 
    $user = $this->User->findByUsername($userName); 

    if (!empty($user['User'])) { 
     $this->Session->renew(); 
     $user['User']['id'] = null; 
     $user['User']['password'] = null; 
     $this->Session->write(self::$sessionKey, $user['User']); 
    } 

    return $this->loggedIn(); 
}