2012-08-04 41 views
9

Xác thực và ủy quyền có thể được tích hợp vào Flask qua số Flask-LoginFlask-Principal plugins. (Hoặc cũng có khả năng thông qua plugin Flask-Security.)Flask-Admin + (Flask-Login và/hoặc Flask-Principal)

HOWEVER: Flask-Admin - plugin khác cung cấp bảng điều khiển phụ trợ - không phải là bản thiết kế đã đăng ký ... và, tôi tin (vô cùng như tôi có thể nói), các trình trang trí được Flask-Login và Flask-Principal sử dụng - và nếu không được yêu cầu cho người dùng truy cập một khung nhìn được hiển thị ... những người trang trí chỉ hoạt động trên các khung nhìn là một phần của kế hoạch chi tiết đã đăng ký.

HAI CÂU HỎI:

1) Làm thế nào để đăng ký Flask-Admin như một kế hoạch chi tiết trong ứng dụng của tôi, và/hoặc cho phép Flask-Đăng nhập và/hoặc trang trí Flask-Principal để bảo vệ quan điểm liên quan đến Flask-Admin ?

2) Tại sao công cụ Flask-Login và Flask-Principal chỉ hoạt động trên các đối tượng "tự nhiên" của ứng dụng của tôi ... chứ không phải đối tượng (ví dụ: "Admin") được nhập từ plugin? Làm thế nào tôi có thể làm việc xung quanh vấn đề này ... nếu thực sự tôi đang cảm nhận nó một cách chính xác?

Tôi thu thập vấn đề này là không có mồ hôi để tôi tạo chế độ xem được bảo vệ cho trang chỉ mục chính của ứng dụng của tôi ... hoặc bất kỳ trang nào khác có chế độ xem nằm bên trong kế hoạch chi tiết. Tôi dường như không thể làm điều đó cho trang chỉ mục Flask-Admin (trong đó, một lần nữa, không có kế hoạch chi tiết).

Trả lời

11

Flask-Admin cung cấp một cách khác để cung cấp xác thực - bạn chỉ cần phân lớp các AdminIndexBaseIndex views (hoặc quan điểm từ contrib nếu bạn chỉ cần những người) và thực hiện các phương pháp is_accessible. Xem the documentation để biết thêm chi tiết. Ngoài ra còn có an example được cung cấp trong kho lưu trữ.

+0

Cảm ơn, Sean ... cho chuyển tôi lên tài liệu cho một này. Tôi đã xem xét chúng, và cố gắng thực hiện chúng ... mặc dù không có kết quả. Sử dụng phương pháp is_accessible sau đó làm cho nó không cần thiết để sử dụng Flask-Đăng nhập để bảo vệ bảng điều khiển admin? Có nghĩa là: sau đó tôi không cần một Flask-Login trang trí cho def của bất kỳ xem Flask-Admin? Tôi phải nói, bên ngoài repo, các tài liệu là mỏng cho auth với Flask-Admin. Nếu, tình cờ, ngoài repo trên, bạn đi qua một thực hiện công khai của giải pháp đó ... rất thích biết về nó. – Sean

+1

@Sean - bạn không cần trang trí * Đăng nhập Flask * nhưng bạn sẽ cần phải sử dụng các phương pháp Flask-Login để xác thực người dùng. Nếu bạn nhìn vào [dòng 85] (https://github.com/mrjoes/flask-admin/blob/master/examples/auth/auth.py#L85) và ngoài ví dụ, bạn sẽ thấy rằng các khung nhìn quản trị viên chỉ có thể truy cập nếu người dùng hiện tại được xác thực. Nếu người dùng chưa được xác thực cố truy cập vào chế độ xem quản trị, họ sẽ được chuyển hướng đến màn hình đăng nhập. –

+0

Liên kết đến một ví dụ là chính xác những gì tôi cần, cảm ơn bạn. – iurii

4

đơn giản ví dụ làm thế nào để sử dụng Flask-Admin với Flask-Principal

from functools import partial 
from flask.ext.admin import Admin as BaseAdmin, AdminIndexView 
from flask.ext.principal import Permission, identity_loaded, Need 
from flask.ext.security import current_user 

PartnerAccessNeed = partial(Need, 'access') 

class PartnerAccessPermission(Permission): 
    def __init__(self, partner_id): 
     need = PartnerAccessNeed(partner_id) 
     super(PartnerAccessPermission, self).__init__(need) 


@identity_loaded.connect 
def on_post_identity_loaded(sender, identity): 
    if hasattr(current_user, 'partner'): 
     identity.provides.add(PartnerAccessNeed(current_user.partner.id)) 

class PartnerAdminIndexView(AdminIndexView): 

    def __init__(self, partner_id, *args, **kwargs): 
     self.partner_id = partner_id 
     super(PartnerAdminIndexView, self).__init__(*args, **kwargs) 

    def is_accessible(self): 

     if current_user.is_anonymous(): 
      return redirect(url_for_security('login')) 

     if not current_user.is_partner(): 
      return False 

     permission = PartnerAccessPermission(self.partner_id) 

     if permission.can():  
      return True 

     return False 

class PartnerAdmin(BaseAdmin): 
    def __init__(self, partner_id, endpoint, name, subdomain, *args, **kwargs): 

     index = PartnerAdminIndexView(name=name, 
             endpoint=endpoint, 
             url='/dashboard', 
             partner_id=partner_id) 

     super(PartnerAdmin, self).__init__(base_template='mcnm/master.html', index_view=index, subdomain=subdomain) 
+1

Trả lại chuyển hướng trong 'is_accessible' được đánh giá là True. Đó chắc chắn không phải là những gì bạn muốn! – Javier