Phân quyền trong Django

15:44 25/02/2021khienhd3 trả lời104 lượt xem

Cho mình hỏi chút về cách tạo 2 user mà khi đăng nhập vào không thể nhìn thấy được giữ liệu của nhau.

  • Tài khoản một khi tạo bài viết thì tài khoản 2 không thể xem được.
  • public một bài viết như nào.

many thanks :)

Gửi Trả Lời

3 phản hồi, đã có trả lời đúng

  1. Đầu tiên mình cần hiểu phân quyền ở đây nghĩa là điều kiện để xem và thao tác thứ gì đó. Bản chất chính là dùng câu điều kiện để điều hướng dữ liệu cho người dùng.

    Okay, với cách hiểu đó, đơn giản nhất là chúng ta tìm sự khác biệt rồi so sánh sau đó if else bình thường. Đó là cách phân quyền nguyên thủy và dễ hiểu nhất. Ví dụ:

    if user.is_staff:
       return {...}
    else:
       return
    

    Trong django, phân quyền hay gặp là:

    • Đăng nhập hay chưa đăng nhập.
    • Tôi làm được, user khác thì không.
    • Admin và user thường.

    Django vốn có sẵn một framework chuyên cho việc permissions. Nguyên tắc của nó đơn giản là, gán cho user 1 quyền dưới dạng 1 chuỗi, sau đó ở phần logic thì check tồn tại chuỗi đó.

    Ví dụ, user A tạo 1 bài viết X hệ thống sẽ gán 1 chuỗi permission tên là can_view_topic cho A. Trong logic, mình sẽ check trước khi hiển thị X là có hay không quyền can_view_topic:

    user.has_perm('app.can_view_topic')
    

    Như vậy, user B không có quyền này, sẽ không thấy được bài viết X.

    Còn nhiều thứ lằng nhằng phức tạp hơn, nhưng nếu cái đơn giản bạn đã hiểu thì expand lên không khó.

    Tham khảo thêm: https://docs.djangoproject.com/en/3.1/topics/auth/default/

    Chúc thành công!

    Bổ sung: Muốn public thì có bạn hãy thêm vào 1 field ở bảng của bài viết. Check nếu field là là True thì vượt qua hết các điều kiện permissions là xong.

    Đã chỉnh sửa lúc 17:40 25/02/2021
    Trả lời được chọn
  2. Trả lời câu hỏi thứ 2 của bạn:

    Framework Permissions của Django giải quyết các phân quyền dạng chung chung. Kiểu như, giám đốc thì có nhiều quyền hơn, trưởng phòng ít hơn 1 tí, nhân viên thì vừa đủ... Chứ không tốt để dùng cho từng instance riêng biệt. Mình đề xuất 2 phương án:

    1. Bạn tự thêm field lưu user như đã nói.
    2. Dùng packages bên thứ 3: https://github.com/django-guardian/django-guardian (đây cũng là gói mình rất hay xài)
  3. Cảm ơn bạn nhé.

    Nếu bài toán là:

    • User A bán đươc x sản phẩm

    • User B bán được y sản phẩm

    Nếu cùng chỉ dùng chuỗi permission thì A chỉ nhìn thấy được sản phẩm mình bán nhưng nếu để làm report cho A theo sản phẩm của A bán thì lúc này mình phải thêm trường để add user rồi làm report theo bạn nhỉ.

    Nếu mình hiểu như trên là đúng thì ngoài cách trên ra có cách nào sử dụng luôn framework của Django không.