我正在为Android应用创建一个网络服务。我正在使用cakephp 3 Auth。我从$this->request->query['username']
和$this->request->query['password]
中的Android应用获取用户名和密码。
如何使用Auth组件识别用户?
到目前为止,我试过的是:
public function login(){
if(!empty($this->request->query['username']) && !empty($this->request->query['password'])){
$this->loadComponent('Auth');
$user=$this->Auth->identify($this->request->query['username'],$this->request->query['password']);
if($user){
$this->output(['status'=>'1','message'=>'Success','user_id'=>(string)$user->id,'plan_id'=>
(string)$user->plan_id]);
}else{
$this->output(['status'=>'0','message'=>'Invalid Username/Password.']);
}
}
}
即使我使用正确的凭据,即使我使用false
,我也会收到debug($user);
。
答案 0 :(得分:2)
你不能只是把东西放在一起并希望它能起作用......我的意思是,文档在哪里说AuthComponent::identify()
会将用户名和密码作为参数?
同样在一个动作中加载auth组件是没有意义的,因为认证只对该单个动作起作用/需要。同样,不要只是把东西放在一起,阅读文档,尝试理解工作原理,必要时查看源代码,然后开始编写,如文档中所示!
话虽这么说,默认身份验证器需要POST数据中的凭据
[...]
FormAuthenticate
允许您根据表单POST数据验证用户。通常这是用户输入信息的登录表单 成。[...]
默认情况下,AuthComponent使用FormAuthenticate 。
* 强调我的
<强> Cookbook > Controllers > Components > Authentication 强>
因此,理想情况下,您应该POST凭据而不是将它们作为查询字符串参数传递。如果那是不可能的并且您必须使用GET(您应该有充分的理由),那么您也可以create a custom authenticator从查询中获取数据,或者甚至将查询字符串数据传递给POST数据在尝试验证用户之前,
$this->request->data['username'] = $this->request->query('username');
$this->request->data['password'] = $this->request->query('password');
这有点难看。
如前所述,您没有在操作中加载auth组件,如文档中所示,这应该在控制器initialize()
方法中完成,理想情况下,如果应该保护完整的应用程序,这将是AppController
public function initialize()
{
parent::initialize();
$this->loadComponent('Auth', /* ... */);
// ...
}
<强> Cookbook > Controllers > Components 强>