2013-02-27 69 views
6

在我的應用程序中,我可以在後端更改用戶權限和角色。更改用戶權限後強制重新認證

當用戶登錄並刪除用戶角色時,用戶仍然可以訪問他實際上不允許再訪問的內容,因爲他缺少角色。只有當用戶使用註銷/登錄重新進行身份驗證時,更改纔會生效。

所以我的問題是,我可以訪問登錄用戶(不是我)的會話嗎?我知道我可以訪問自己的會話並銷燬它,這迫使我再次登錄。但我想獲得登錄的任何用戶的會話。這可能嗎?我找不到任何資源。

我使用PdoSessionStorage與symfony2.1和fosuserbundle。

+0

也在這裏問,沒有答案。 http://stackoverflow.com/questions/14184484/how-to-administratively-invalidate-a-session-that-used-remember-me-option – MDrollette 2013-02-27 16:14:33

+0

@MDrollette我覺得這將會得到回答。我認爲唯一的解決方案可能是一個自定義會話管理器 – 2013-02-27 16:44:28

+0

它只是一個將用戶ID和會話ID一起存儲在會話表中的問題。聽起來不是特別困難,但我不確定最好的方法。 – MDrollette 2013-02-27 16:52:43

回答

9

使您的用戶類實現Symfony\Component\Security\Core\User\EquatableInterface

如果您從isEqualTo()方法返回false,用戶將被重新認證。使用該方法僅比較那些更改時應強制重新認證的屬性 - 您的案例中的角色。

+0

+1好吧,我明白這一點。我必須在哪裏進行此項檢查?我必須在每個請求上都做到這一點? – 2013-02-27 18:03:46

+0

只需讓你的用戶類實現接口。你將被迫執行'isEqualTo()'方法。其餘由Symfony處理。 – 2013-02-27 18:23:50

+0

太棒了!) – 2013-02-27 18:47:35

-1

您可以通過以下的方法相似,我沒有得到解決此問題:

  1. 當用戶登錄時,存儲在會話的所有權限與權限的校驗一起。
  2. 將相同的校驗和存儲在數據庫或磁盤上,並對該用戶ID存儲
  3. 只要用戶發出請求,就驗證磁盤上的校驗和與該用戶在會話中的校驗和是否相符。如果不同,請將權限重新加載到用戶的會話中
  4. 當您更改權限時,更新針對該用戶存儲的數據庫(或磁盤上)的校驗和。這將觸發他們的下一個請求重新同步。
+0

嗯看起來很有趣但很複雜。這是你正在開發的某種幫助臺嗎? – 2013-02-27 17:18:59

+0

@artworkad其實並不複雜,它使用基本的symfony2組件,如服務容器,安全上下文和請求對象來決定如何處理權限。 – JamesHalsall 2013-02-27 17:32:10

+0

@Jaitsu,Symfony內置的解決方案非常簡單,你會歇斯底里地笑。看到我的答案。 ;) – 2013-02-27 17:55:24