2012-03-20 7 views
11

Tôi đang sử dụng thành phần Auth tích hợp CakePHP 2.0. tôi có các bảng sau:

  • Người dùng
  • Groups
  • Profiles

quan hệ Mô hình của tôi như sau:

User belongsTo Group 
User hasMany Profiles 

Khi đăng nhập vào các trang web, tôi nhận thấy phiên xác thực chỉ chứa thông tin bảng người dùng, nhưng tôi cũng cần thông tin của các bảng Nhóm và Tiểu sử cho người dùng đã đăng nhập.

Có cách nào để thực hiện điều đó với thành phần Auth không?

Trả lời

6

Không có cách nào để thực hiện việc này với AuthComponent do cách xử lý khóa phiên. Bạn có thể, tuy nhiên, chỉ cần lưu nó vào phiên mình.

Cách duy nhất để làm điều này là để thêm vào phiên giao dịch khi người dùng đăng nhập:

function login() { 
    if ($this->Auth->login($this->data)) { 
     $this->User->id = $this->Auth->user('id'); 
     $this->User->contain(array('Profile', 'Group')); 
     $this->Session->write('User', $this->User->read()); 
    } 
} 

Sau đó, trong beforeFilter() của bạn trong AppController của bạn, tiết kiệm rất var cho các bộ điều khiển để có được:

function beforeFilter() { 
    $this->activeUser = $this->Session->read('User'); 
} 

// and allow the views to have access to user data 
function beforeRender() { 
    $this->set('activeUser', $this->activeUser); 
} 

Cập nhật: Kể từ CakePHP 2.2 (announced here), bây giờ AuthComponent chấp nhận khóa 'chứa' để lưu trữ thông tin bổ sung trong phiên.

+0

Lời cảnh báo khi thiết lập người dùng trong phiên. Dữ liệu phiên có thể vẫn được đặt ngay cả sau khi người dùng không còn được xác thực. Bạn sẽ cần đảm bảo dữ liệu Phiên sẽ bị xóa khi đăng xuất. Bạn có thể thực hiện việc này đơn giản bằng cách lưu phiên vào "Auth.User" thay vì "User". 1 để cập nhật câu trả lời của bạn để đề cập đến bản cập nhật CakePHP 2.2. – drmonkeyninja

1

Theo như tôi biết, thành phần Auth chỉ lưu trữ dữ liệu từ mô hình Người dùng của bạn. Bạn có thể sử dụng thông tin đó để lấy dữ liệu mong muốn từ các mô hình khác, bởi ví dụ sử dụng này trong điều khiển của bạn:

$group_data = $this->Group->findById($this->Auth->user('group_id')); 

Hoặc

$profile_data = $this->Profile->findByUserId($this->Auth->user('id')); 

Nhưng tôi không nghĩ rằng bạn có thể lấy nó từ thành phần Auth trực tiếp, vì nó không lưu dữ liệu mô hình liên quan ra khỏi hộp.

+0

Tôi cần tất cả thông tin qua trang web để chỉ thử từ AUTH. Vì vậy, không muốn viết một truy vấn tìm kiếm .. :) – AnNaMaLaI

1

Hai cách:

1) Mở rộng các lớp FormAuthenticate (xem/Controller/Component/Auth) hoặc bất cứ điều gì bạn sử dụng để đăng nhập và ghi đè lên các phương pháp _findUser() và nói với các thành phần Auth sử dụng lớp ủy quyền này. Xem trang này cách thực hiện tất cả các điều đó http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html

2) Chỉ cần thực hiện một phương thức trong mô hình sẽ tìm nạp tất cả dữ liệu bạn muốn và gọi nó trong phương thức đăng nhập của bộ điều khiển và ghi dữ liệu vào phiên. IMO rất tiện khi có một phương thức như vậy bởi vì đôi khi bạn cần làm mới dữ liệu phiên.

Bởi vì xét của bạn về câu trả lời khác:

Bạn sẽ phải viết một phương pháp và một số mã trong một mô hình mà sẽ đưa bạn trở về dữ liệu. CakePHP không thể đọc được suy nghĩ của bạn và một cơ sở dữ liệu không có mã. Không có vấn đề mà cả hai cách đề nghị bạn sẽ sử dụng, bạn sẽ phải viết mã.