2013-09-26 289 views
12

Theo http://laravel.com/docs/eloquent, người ta có thể Ẩn thuộc tính từ mảng hoặc chuyển đổi JSON bằng cách sử dụng biến $ hidden được bảo vệ trong Mô hình.Thuộc tính ẩn Laravel. ví dụ. Mật khẩu - bảo mật

class User extends Eloquent { 
    protected $hidden = array('password'); 
} 

Tuyệt vời, tuy nhiên khi chạy print_r(User::all()) mật khẩu được mã hóa được gửi từ máy chủ đến ứng dụng khách bên trong đối tượng Người dùng.

Điều này không chỉ giới hạn đối với print_r(), nếu người dùng cụ thể được truy vấn, $user->password sẽ hiển thị mật khẩu được mã hóa trong chế độ xem.

Có cách nào để ngăn chặn điều này không? Mỗi khi đối tượng người dùng của tôi được truy vấn, mật khẩu sẽ được gửi cùng với nó như là một phần của dữ liệu, mặc dù nó không cần thiết.

Illuminate\Database\Eloquent\Collection Object 
(
[items:protected] => Array 
    (
     [0] => User Object 
      (
       [hidden:protected] => Array 
        (
         [0] => password 
        ) 

       [connection:protected] => 
       [table:protected] => 
       [primaryKey:protected] => id 
       [perPage:protected] => 15 
       [incrementing] => 1 
       [timestamps] => 1 
       [attributes:protected] => Array 
        (
         [id] => 1 
         [email] => [email protected] 
         [first_name] => Admin 
         [last_name] => User 
         [password] => $2y$10$7Wg2Wim9zHbtGQRAi0z6XeapJbAIoh4RhEnVXvdMtFnwcOh5g/W2a 
         [permissions] => 
         [activated] => 1 
         [activation_code] => 
         [activated_at] => 
         [last_login] => 
         [persist_code] => 
         [reset_password_code] => 
         [created_at] => 2013-09-26 10:24:23 
         [updated_at] => 2013-09-26 10:24:23 
        ) 

Trả lời

20

Khi bạn chạy User::all(), nó sẽ trả về đối tượng Bộ sưu tập. Bộ sưu tập này chứa tất cả Người dùng của bạn ở dạng đối tượng. Do đó, Người dùng của bạn sẽ chứa mật khẩu của họ. Điều này là để bạn có thể hiển thị mật khẩu băm vì bất kỳ lý do gì. Tuy nhiên, như bạn đã nói trước đây, nếu bạn chuyển đổi Bộ sưu tập hoặc Người dùng thành mảng hoặc JSON, trường mật khẩu sẽ biến mất nếu bị ẩn.

Do đó, nếu bạn muốn để có được loại bỏ chúng, hãy thử chạy như sau:

$array_of_users = Users::all()->toArray(); 
$json_of_users = Users::all()->toJson(); 

dd() những cả hai để kiểm tra chúng. Trường mật khẩu sẽ biến mất.

Điều này được giải thích trong tài liệu của Laravel trên serialization.

3

Không, vì bạn KHÔNG nên làm điều gì đó như thế trong sản xuất (hoặc trong thế giới thực).

Quan điểm của bạn, được viết bằng Blade, có thể nhận kết quả User::all() và xử lý nó, nhưng đó là PHP (máy chủ), không phải HTML (máy khách) và nó sẽ chuyển đổi dữ liệu đó sang HTML trước khi nó được truyền cho khách hàng.

Vì vậy, đây

print_r(User::all()) 

là một cái gì đó mà bạn sẽ không bao giờ làm gì để hiển thị cho người sử dụng, đó là một cái gì đó chúng tôi sử dụng để gỡ lỗi, nhưng nó thực sự có ý nghĩa gì.

Nhưng nếu bạn có bất kỳ ví dụ nào khác, khi dữ liệu nhạy cảm có thể được chuyển qua chế độ xem cho khách hàng của bạn, chúng tôi cũng có thể thảo luận điều đó.

+0

Ok ... về '$ user-> password' – Gravy

+0

Đó là điều bạn có thể sử dụng trên mã của mình. Nếu bạn nghĩ rằng đây là một dữ liệu nhạy cảm, không bao giờ viết nó trên một cái nhìn. :) –

+0

Tôi đồng ý với bạn. Nhưng sau đó tại sao bạn có thể bảo vệ nó tự động thông qua một yêu cầu json hoặc mảng, nhưng không phải thông qua đối tượng? – Gravy

0

Trong laravel nếu bạn trả về bất kỳ đối tượng mô hình nào trong bộ điều khiển đại diện cho bất kỳ thực thể nào sẽ được chuyển đổi thành JSON.
Điều đó hữu ích cho việc tạo API và có các trường bị ẩn giúp rất nhiều