2017-08-29 126 views
1

我正在使用Eve構建REST API並使用角色來保護特定的端點,但除此之外,我還需要強制實施特定的字段級訪問規則。我有一個基本的users端點以下模式:你如何在夏娃實施現場級安全?

users = { 
    'schema': { 
     Schema.NAME: { 
      'type': 'string', 
      'minlength': 1, 
      'maxlength': 32, 
      'required': True, 
      'unique': True 
     }, 
     Schema.PASSWORD: { 
      'type': 'string', 
      'required': True 
     }, 
     Schema.ROLE: { 
      'type': 'string', 
      'allowed': ['end user', 'manager', 'admin'], 
      'required': True 
     } 
    }, 

端點具有公共POST訪問,所以任何人都可以創建一個用戶(即新用戶可以創建自己的帳戶)。最終用戶可以更改自己的密碼,管理員可以更改最終用戶的密碼,並且管理員可以更改最終用戶的角色。

我沒有看到用標準模式定義來做到這一點的方法。我還查看了Cerberus驗證,但似乎並未支持跨多個文檔的任何邏輯(即通過檢查客戶端是否被認證爲管理員user來驗證最終用戶的user文檔的修改)。

我實現我期待的效果通過添加事件掛鉤:

app.on_insert += all_users_created_equal 
app.on_pre_PATCH_users += restrict_role_updates_to_admins 

... 

def all_users_created_equal(resource, docs): 
    """Ensure that all users are created as end users. 
    Managers and Admins must be granted these roles by an existing 
    manager or admin.""" 
    if resource == 'users': 
     for doc in docs: 
      doc['role'] = 'user' 

def restrict_role_updates_to_admins(request, lookup): 
    if 'role' in request.json: 
     users = app.data.driver.db['users'] 
     user = users.find_one({'name': request.authorization.username}) 
     if user and user['role'] != 'admin': 
      # Non-admins cannot update roles. Break the lookup to fail the request. 
      lookup['_id'] = None 

但它哈克以失敗請求與請求內容渣土。有沒有更好的方法來實施現場級安全?或者,如果沒有,是否有更好的方法來使用事件掛鉤來告訴服務器失敗請求?從鉤子引發異常的確會導致請求失敗,但異常會在服務器上傳播,並且不理想。

+1

使請求失敗的更好方法是調用flask的中止函數。以下是文檔示例(http://flask.pocoo.org/docs/0.12/quickstart/#redirects-and-errors)。 – gcw

回答

0

是否有更好的方法來實施字段級安全性?

據我所知,目前沒有支持現場級自定義訪問控制的機制。如果有的話,你會找到它。

我建議你儘可能改變你的設計。我認爲將訪問控制機制與受到前夕支持的CRUD操作分開會更好。我的意思是,你可以開發一個服務器來控制訪問。此訪問控制服務器獲取來自用戶的所有請求並在您的體系結構中扮演中介角色。然後,如果某個請求與訪問控制規則(您在問題中提到的)相符,則該請求將發送至CRUD服務器(eve服務器),並且可能會影響您的數據庫。

該體系結構更簡單,因爲它將用戶訪問控制與CRUD操作分開並且可擴展,因爲您可以在將來添加更多訪問控制規則。

+0

有趣的建議。我必須權衡這種分離的價值與添加的網絡流量以及未嵌入這些訪問控制的CRUD服務器的風險。訪問控制服務器到CRUD服務器設置基本上類似於典型的Web服務器到數據庫設置。感謝您的評論! – Riaz