-1

私はCakePHP2.2.4を使用しており、AtuhComponenetでの作業を開始しました。

これは私のAppControllerです:

class AppController extends Controller {
    public $components = array('Auth', 'Session');

    public function beforeFilter() {
        $this->Auth->authorize = array('Controller');
        $this->Auth->authenticate = array(
            'Form' => array (
                'scope'  => array('User.active' => 1),
                'fields' => array('username' => 'email', 'password' => 'password'),
            )
        );      
    }

    public function isAuthorized($user) {

        debug($user);

        return true;
    }
}

これは私のUser.phpモデルです

class User extends AppModel {

    public $name = 'User';

    /* Relazioni */
    public $hasOne = 'Profile';

    public $belongsTo = 'Role';

    public $hasMany = array(
        'Lead' => array(
            'className' => 'Lead'
        )
    );  

}

これは私のUserController.phpです

<?php

App::uses('AppController', 'Controller');

class UsersController extends AppController 
{   
    public $name = 'Users';

    public $uses = array();

    public function beforeFilter() 
    {
        parent::beforeFilter();        
    }

    public function login()
    {
        if ($this->request->is('post')) 
        {
            if ($this->Auth->login()) 
            {
                debug('Logged');
            } 
            else 
            {
                $this->Session->setFlash('Login non autorizzato', 'default', array('class' => 'errore'), 'login');
            }
        }   
    }

    public function logout()
    {
        $this->redirect($this->Auth->logout());
    }

}

Auth Componentの使用に奇妙な問題があります。これは、レイアウトの最後にsql_dump要素があり、クエリが出力されないためです。

ただし、正しい値を入力するとログインしません

Authコンポーネントが機能しないのはなぜですか?

編集:

リクエストのデータは次のとおりです。

Array
(
    [User] => Array
        (
            [email] => test@test.it
            [pwd] => abc
        )

)
4

2 に答える 2

4

AppController のコードが間違っています

public function beforeFilter() {
    $this->Auth->authorize = array('Controller');
    $this->Auth->authenticate = array(
        'Form' => array (
            'scope'  => array('User.active' => 1),
              // password != pwd as you post it
            'fields' => array('username' => 'email', 'password' => 'password'), 
        )
    );      
}

に変更します

'fields' => array('username' => 'email', 'password' => 'pwd'),

または、フォームpasswordの代わりに必ず投稿してくださいpwd

この件に関するドキュメントについては、https://github.com/cakephp/cakephp/blob/master/lib/Cake/Controller/Component/Auth/FormAuthenticate.phpを参照してください。

于 2013-01-05T14:44:57.010 に答える
1

この例が直接適用されない Auth を使用してログインできない人のために、ここに到着した人のためにこの回答を後付けしたいと思います。

覚えておくべき重要ことは、Auth は基礎となるデータベース列が「ユーザー名」と「パスワード」であることを想定していることです。何らかの理由でこれを延期する場合、たとえば、ユーザーの電子メールを検証したい場合 (非常に一般的) で、これを反映するようにテーブルの列名を変更する場合は、Auth にこれを伝える必要があります。

その理由は、基になるクエリが失敗するためです。最終的に、舞台裏で行われているのは、指定されたフィールドに一致する単純なクエリだけです。例(正確ではありません-単にデモンストレーション目的のため-select *は悪いです):

SELECT * FROM users WHERE username = 'blahblahblah' AND password = 'someInsan31yh4sh3dpassw0rd'

基になるテーブルの「メール」列の「ユーザー名」列が欠落している場合、このクエリは明らかに失敗します。ログインできなくなり、通常はクエリが失敗したことを示すものはありません (SQL ダンプからも除外されます)。ただし、AppController の次のコードは問題を解決します。

public $components = array(
    'Auth' => array(
        'authenticate' => array(
          'Form' => array(
             'fields' => array('username' => 'columnUsedForValidatingUsername', 'password' => 'columnUserForValidatingPassword')
          )
        )
    )
);

この場合、ジッピの答えは完全に正しかった。しかし、StackOverflow の回答者として、問題が発生している理由を説明し、具体的でない回答を提供するために、これを見つけた人に義務があるように感じます。

乾杯

于 2014-01-03T22:06:29.177 に答える