2011-04-03 146 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(); 
}