2017-01-10 179 views
3

我從Symfony 3開始,我需要一些關於如何繼續實施動態授權和認證過程的指導。Symfony3授權過程

首先,身份驗證位大部分已完成,我已根據此鏈接從symfony文檔完成:http://symfony.com/doc/current/security/entity_provider.html。我還不懂的是如何實現接口函數getRoles()爲了從數據庫返回一個值(我有一個與User表相關的表Role)。

其次,授權部分。我的應用程序需要最終用戶創建自己的訪問機制,換句話說,我有一個用戶創建角色的界面,然後定義角色能夠訪問的頁面以及它將擁有的權限(創建,讀取,更新,刪除等)。之後角色歸屬於應用程序用戶。

總而言之,這是非常標準的東西,所以Symfony必須有一個乾淨的方式來做到這一點。我到目前爲止的想法是我必須使用ACL,所以我按照文檔所做的那樣:http://symfony.com/doc/current/security/acl.html

我的誠實問題是:現在是什麼?我採取了哪些步驟來全面實施身份驗證機制?我現在應該怎麼做才能堅持和檢索訪問規則?我如何將它們與用戶角色聯繫起來?

P.S .:這個問題可能與這裏的其他一些問題有所重複,但事實被告知,這些問題也沒有幫助我,也沒有在文檔中找到我。

回答

3

所以,你的問題是非常廣泛的。無論如何,這是一個很好的問題,所以我會試着回覆。

認證

沒有在這裏說,我只是希望你用FOSUserBundle文章本身的建議:爲實現在Symfony的註冊/登錄系統的最佳方式,它會給你一個想法整個過程如何工作。從頭開始如果你不是Symfony,有經驗的開發人員似乎不是最好的主意。

FOSUserBundle試試吧!

授權過程

關於授權主要通過兩種選擇:使用Voters和使用ACL

根據我的經驗,最好的選擇是使用Voters

實際上,在大多數情況下,您將在您的實體和用戶之間實現雙向引用(請參閱Doctrine的documentation about this)。在這種情況下,ACL不是必需的,甚至不鼓勵。

實際上,ACL只是在兩個對象(用戶和用例中的文章)之間建立關係。爲了管理這種關係,它使用數據庫中的表格,所以它必須查詢它以獲得關係並檢查授權權利。

但是,如果您在實體中直接在用戶和文章/組之間存在雙向引用,那麼您已經有了這種關係,因此您可以使用選民,並且使用ACL是多餘的,如所說的,因爲這是無用的重複,所以不鼓勵。

如果你的實體中沒有這種雙向關係,那就創建它:這對未來其他事情肯定會有用,而且無論如何,你將有能力直接從你的實體訪問你的鏈接實體實體樹!

更多,在您的情況,您不能使用ACL,你會對你的對象的自定義權限/特權:選民,再次,是構建這樣的事情是最好的選擇。

Don't use ACL, but Voters instead

如何進行

我會做的第一件事,就是在interface所有可用的權限列表:畢竟,他們是嚴格相關的應用程序的業務邏輯,因爲這是不可能的用戶讓別人能夠做一些事情,你的應用程序不能做:如果你的應用程序沒有實現的編輯流程,那麼它是不可能的用戶給某人編輯文章的能力。很明顯。

所以,這樣的事情可能是好的:

interface PrivilegesEnum 
{ 
    const CREATE = 1; 
    const EDIT = 2; 
    const DELETE = 4; 
    const READ = 8; 
    const OTHER = 16; 
    // ... Other privileges 
} 

正如你所看到的,我已經給了一個數值每個特權:這會給你使用位掩碼的能力,這是一個真正強大機制來管理這類事情:它允許您只使用數據庫中的一個字段來列出所有權限。

你可以閱讀更多關於位掩碼的位置:

我在過去使用這個系統,而這些都是我收集了一些有用的鏈接。他們可能會幫助你!

建立一個表格,列出特權

可能對你有用的另一件事情是FormType列出您可用的特權:你能做到這一點寫一個簡單的custom FormType

如何管理角色

要管理角色閱讀how Roles are managed by the Security ComponentFOSUserBundleon Stackoverflow

用戶和組文章

一旦你達到這一點,你應該之間的關係有更多的實體,閱讀更多關於教義關係機制的知識,並且你應該能夠將你的用戶與他們的角色聯繫起來埃爾集團和文章。

無論如何,您將擁有所有必需的概念和實用工具,以更好地考慮您的具體實施。

最後要注意

正如你可以看到,實現這種類型的授權過程是多麼的不那麼簡單。

我建議你仔細考慮在應用程序開發的這個階段是否真的需要它,因爲如果你將來可以推遲它,那麼我建議你這樣做。

如果你想盡快上網,實現這個系統將需要大量的時間去學習,實現,調試和重構代碼(我說的是幾周而不是幾天!)。

所以,如果你有這麼多時間,那麼,去實現這個系統。但是如果你覺得自己還沒有全部這麼做,那麼就去一個更「靜態」的系統,去上網,然後讓它更「動態」。

畢竟,這是Lean Startup era

祝你好運!

+2

緩慢的鼓掌爲答案!對於任何對授權/認證主題感興趣的人來說,這是一個金礦...... –

+0

感謝您的回覆,我會盡快回復,我會盡快給您回覆。我知道這需要一段時間才能正確實施,但我確實需要它。我已經從頭開始用Java做了這件事,但是我沒有使用框架,這些框架在完成任何事情的時候都會綁定你。所以我很好地掌握了它背後的邏輯(我實際上是在重做,試圖'重寫'Symfony的安全配置,但我知道這是不行的)。基本上我只是用Symfony的方式來做到這一點。 – Eduardo

+0

那麼,選民......說實話,只是說「使用選民」並不能真正解決我的問題,也許我只是不明白關於他們的文件。我想我意識到了爲什麼,所以讓我問你一個問題:我需要爲每個對象創建一個選民嗎? – Eduardo