2017-08-06 96 views
0

有一個web應用程序在服務器上使用以下堆棧: akka-persistence/service-layer/akka-http(for REST)訪問/授權控制:akka-persistence /服務層/ akka-http堆棧

問題是: 我怎樣才能 - 以最優雅,最乾燥的方式 - 確保只有那些用戶可以執行服務層中有權這樣做的功能(在給定的輸入參數下)。

因此,例如,讓我們簡單的例子:

getEntity(userID:UserID, ref:EntityID):Entity = ???

我應該如何修改getEntity這樣只有那些用戶被允許在調用者的用戶標識與參數中的用戶標識相同的情況下執行它?

什麼是最優雅,可組合,乾燥的方式來做到這一點?

使用自定義monads?

使用延續monads?

使用akka-http樣式指令?

使用implicits?

使用Free-Monads?

使用箭頭?

使用Kleiesly?

我無法想象。

+1

什麼是最簡單的事情,可能工作? –

+1

這取決於應用程序的大小,權限系統的複雜性以及您的口味。沒有一個適合所有問題的解決方案。 – michaJlS

+1

我的解決方案是授權服務,它手動複製我的服務方法的接口,以及一個Credentials參數,它封裝了作出授權決定所需的所有數據。外部API通過授權Facade調用服務方法。我相信這可以做得更多,但是我們沒有那麼多的服務。 – acjay

回答

1

我會怎麼做是使用隱式上下文:

getEntity(userID:UserID, ref:EntityID)(implicit c: Context): Entity = ??? 

,然後無論是在上下文是你的,即

trait Context { 
    def canExecute(userId: UserID): Boolean 
} 

您可能要打破這種所以你有角色,權限等。另外,如果你使用的是類型參數,那麼你可以使用上下文綁定,並使其更清潔一點:

trait Context[A] { ... } 
def getEntity[A: Context](userID:UserID, ref:EntityID): Entity = ??? 

隱式參數對於能夠傳遞像「當前安全上下文」或「關聯ID」這樣的上下文信息非常有用,該信息不是域邏輯的核心,而是必須一直涉及到堆棧。

+0

嗯,有趣的想法,謝謝! – jhegedus