0

こんにちは、cakePHP バージョン 2.3.6 を使用しています。登録とログインを作成しようとしていますが、登録済みのユーザー名とパスワードでログインすると、間違ったユーザー名またはパスワードが表示され続け、ユーザー名に電子メールを使用しています。助けてください、ありがとう。

AppController


 class AppController extends Controller {

        public $components = array(
        'Session',
        'Auth' => array(
           'loginRedirect' => array('controller' => 'users', 'action' => 'index'),
           'logoutRedirect' => array('controller' => 'pages''action'                =>'display',  'home')
    )
);

    public function beforeFilter() {
        $this->Auth->allow('index', 'view');
    }


}


View Login

<div class="users form">
    <?php echo $this->Session->flash('auth'); ?>
    <?php echo $this->Form->create('User'); ?>
    <fieldset>
    <legend><?php echo __('Please enter your username and password'); ?></legend>
    <?php echo $this->Form->input('email');
            echo $this->Form->input('password');
            ?>
    </fieldset>
    <?php echo $this->Form->end(__('Login')); ?>
</div>

UserController


<?php


class usersController extends AppController
{
    public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('add','login','logout');
    }
    var $name = 'Users';

    public function view($id = null) {
        $this->User->id = $id;
        if (!$this->User->exists()) {
        throw new NotFoundException(__('Invalid user'));
        }
        $this->set('user', $this->User->read(null, $id));
     }


    public function add()
    {

    if (!empty($this ->data))
    {
    $this->User->create();
    if ($this->User->save($this->data))
    {
        $this->Session->setFlash('Thank you for registering');
        $this->redirect(array('action'=>'index'));
       }

    }

    }




     function index()
    {

    }
    public function login() {
        if ($this->request->is('post')) {
            if ($this->Auth->login())
            {
               $this->redirect($this->Auth->redirectUrl());
           }
            else
           {
               $this->Session->setFlash(__('Username or password is incorrect'),        'default', array(), 'auth');
       }
     }
    }
    public function logout() {
        return $this->redirect($this->Auth->logout());
    }
}

**UserModel**

App::uses('AuthComponent','Controller/Component');
    class User extends AppModel
{

        var $name = 'User';

    public $validate = array(
        'email' => array(
            'valid' => array(
            'rule' => 'email',
            'message' => 'Please enter an email address for username',

        ),
        'unique' => array(
            'rule' => 'isUnique',
            'message' => 'This username has already been taken',

        ),
        'eValid' => array(
            'required' => true,
                'rule' => array('notEmpty'),
                'message' => 'Please enter a username'

                )

        ),



        'password' => array(
        'pValid' => array(
        'required' => true,
        'rule' => array('notEmpty'),
        'message' => 'Please enter a valid password'
        ),

        'minPword' => array(
            'rule' => array('minLength', 8),
            'message' => 'Please enter a password that is minimum 8 characters'


        )

        ),


);








        public function beforeSave($options = array()) {
        if (isset($this->data[$this->alias]['password'])) {
        $this->data[$this->alias]['password'] = AuthComponent::password($this-   >data[$this->alias]['password']);
       }
        return true;
      }


     }
4

1 に答える 1

1

CakePHP の認証コンポーネントは、デフォルトで「ユーザー名」および「パスワード」フィールドで機能します。まず、認証コンポーネントに「ユーザー名」フィールドの代わりに「メール」フィールドを使用するように指示する必要があります。

'Auth' => array
(
       'authenticate' => array
       (
           'Form' => array
           (
               'fields' => array('username' => 'email', 'password' => 'password')
           )
       ),
       'loginRedirect' => array('controller' => 'users', 'action' => 'index'),
       'logoutRedirect' => array('controller' => 'pages', 'action' =>'display', 'home')
)

認証ポリシーを完全に制御するために isAuthorized チェックを有効にすることをお勧めします ( http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#authorization-objects )。セキュリティを強化するために、カスタムのパスワード ハッシュ メソッドを設定することもできます。

ハッピーコーディング!

編集

ソースには複数の問題がありました。まず、ダンプのパスワード フィールドがパスワード ハッシュに対して短すぎました...クックブックのチュートリアルでは、パスワード フィールドが VARCHAR( ではなく VARCHAR(50) であることがわかります。 30)。

第二に、CakePHP は「設定より規約」のフレームワークであるため、常にクックブックの指示に従うことを忘れないでください。コントローラーの名前は CamelCased である必要があるため、usersController は UsersController である必要があります。これにより、

$name = 'Users';

声明。ドライコントローラー & 少ない指示は頭痛の種が少ないことを意味します ;) そして、フォルダ名の慣習も尊重してください!

3 番目に、SQL ダンプには、メールの複数のレコードが多数ありました。これは、フィールドの問題を解決したとしても、ログイン ポリシーでさらに多くの問題を発見できたことを意味します。幸いなことに、モデル検証でいくつかのテストを行った後、これにパッチを当てました...この問題を解決するには、User テーブルを空にして試してみてください。

4 つ目は、セキュリティの改善です。電子メールでお送りしたソース コードに、次の内容を追加しました。

Security::setHash('sha256');

login() および add() 関数の上に。これにより、アプリケーションのソルトと組み合わせて、パスワードのより強力なハッシュが提供されます。これは、必要な関数 (つまり、ユーザー テーブルのパスワード フィールドを保存または編集する場所) で常に宣言します。これには、ユーザー テーブルのパスワード フィールドを編集する必要があることに注意してください。VARCHAR(64) 以上に変更します (実際、SHA256 は 64 文字の文字列を返します)。

それでは、CakePHP をお楽しみください。

繰り返しますが...ハッピーコーディング!

于 2013-09-17T11:25:40.420 に答える