2015-04-09 29 views
9

Tôi bắt đầu sử dụng CakePHP 3 sau một thời gian sử dụng CakePHP 2 và tôi gặp khó khăn khi tạo đăng nhập xác thực.Đăng nhập [Auth-> identification()] luôn luôn sai trên CakePHP 3

Chức năng xác thực mới $this->Auth->identify() luôn trả về false.

Trên cơ sở dữ liệu, mật khẩu được mã hóa hoàn hảo và truy vấn mang người dùng cũng được.

Mã của tôi:

AppController:

[...] 
class AppController extends Controller{ 
    public function initialize(){ 
     $this->loadComponent('Flash'); 
     $this->loadComponent('Auth', [ 
      'loginRedirect' => [ 
       'controller' => 'Admin', 
       'action' => 'index' 
      ], 
      'logoutRedirect' => [ 
       'controller' => 'Pages', 
       'action' => 'display' 
      ] 
     ]); 
    } 

    public function beforeFilter(Event $event) 
    { 
     $this->Auth->allow(['display']); 
    } 
} 

UserController:

[...] 
class UsersController extends AppController{ 
    public function beforeFilter(Event $event) 
    { 
    parent::beforeFilter($event); 
    $this->Auth->allow(['logout']); 
    } 
[...] 
    public function login() 
    { 
     if ($this->request->is('post')) { 
      $user = $this->Auth->identify(); 
      if ($user) { 
       $this->Auth->setUser($user); 
       return $this->redirect($this->Auth->redirectUrl()); 
      } 
      $this->Flash->error(__('Invalid username or password, try again')); 
     } 
    } 
[...] 

tài khoản (Model Entity):

<?php 
namespace App\Model\Entity; 

use Cake\Auth\DefaultPasswordHasher; 
use Cake\ORM\Entity; 

class User extends Entity{ 
    protected $_accessible = [*]; 
    protected function _setPassword($password){ 
     return (new DefaultPasswordHasher)->hash($password); 
    } 
} 

Xem:

<div class="users form"> 
<?= $this->Flash->render('auth') ?> 
<?= $this->Form->create() ?> 
    <fieldset> 
     <legend><?= __('Please enter your username and password') ?></legend> 
     <?= $this->Form->input('username') ?> 
     <?= $this->Form->input('password') ?> 
    </fieldset> 
<?= $this->Form->button(__('Login')); ?> 
<?= $this->Form->end() ?> 
</div> 
+0

chiều dài của lĩnh vực mật khẩu của bạn là gì? – ADmad

+0

Đó là VARCHAR (255) – Beto

+3

Là 45 .... Đã thay đổi thành 255 và hiện đang làm việc =) Cảm ơn = D – Beto

Trả lời

22

CakePHP3 sử dụng thuật toán băm khác theo mặc định so với 2 (bcrypt so với SHA1), vì vậy bạn cần phải làm cho độ dài mật khẩu của mình dài hơn. Thay đổi trường mật khẩu của bạn thành VARCHAR (255) để an toàn.

Khi CakePHP 3 cố gắng xác định mật khẩu băm trong bộ nhớ của bạn từ này-> Xác thực() so với mật khẩu băm trong cơ sở dữ liệu, nó sẽ không bao giờ khớp vì một số ký tự bị thiếu. Thay đổi thành 255 là nhiều hơn mức cần thiết, nhưng có thể giúp bằng chứng trong tương lai nếu một băm an toàn hơn được sử dụng trong tương lai. 255 được khuyến nghị vì số ký tự có thể được lưu trữ trong một byte.

5

Giải quyết: Loại trên cơ sở dữ liệu ít hơn yêu cầu. Đã thay đổi thành varchar (255) và hiện hoạt động tốt :)

+2

Tại sao bạn không đánh dấu câu trả lời của cs01 là được chấp nhận? Đó là những gì anh ấy nói ... – Albert

+2

Tôi không biết điều này là có thể (bằng cách nhấp vào v xanh) ... Tôi đã cập nhật. Cảm ơn bạn đã tip =) – Beto

+0

KIỂM TRA NÀY! Đây cũng là một vấn đề đối với tôi, sau khi bướng bỉnh và không kiểm tra. – mewc

1

Tôi đã gặp vấn đề tương tự. Đăng nhập [Auth-> identification()] không hoạt động đối với tôi. Thay đổi độ dài mật khẩu trong db sẽ giải quyết vấn đề.

+0

đã thay đổi độ dài nhưng không có kết quả..still có thể vào -> là ('post') – aswzen

1

Xin chào chia sẻ đoạn mã của tôi cho Đăng nhập Auth, tất cả Kiểm tra là OK, trong CakePHP 3.1, hải quan (Bảng + xem đăng nhập BootStrap 3 + SQL base + custom bootstrap.php cho tiếng Tây Ban Nha trong Inflector :: rules (***** **))

Tất cả các mã trong

https://bitbucket.org/snippets/eom/rLo49

Các vấn đề liên quan