2010-09-21 39 views
3

我使用symfony的1.4和sfGuardDoctrinePlugin,我知道了安裝和設置罰款,但我有以下問題:symfony的sfGuardUser hasCrendential後實時更新

如果我登錄的管理員和更新權限一個用戶,該用戶必須註銷,然後再次登錄,然後再添加新的憑證/權限。

有沒有辦法解決這個問題?

我不知道這將是多麼容易解決。當用戶登錄時,我認爲他們的憑證會在那裏添加到他們的會話屬性中。所以當管理員更新他們的憑證時,他們的會話仍然保留着舊的憑證。這意味着任何對hasCredential的調用都不是「實時」的。

謝謝

回答

2

這會爲您的應用程序的每個請求添加額外的查詢。您可以強制更新憑證$user->getSfGuardUser()->refresh(true),該憑證將重新加載實體及其所有關係(以及其權限)。

+0

您可以通過只這樣做,比如說減少的影響,全球每10個頁面加載的:if(1 ==蘭特(1,10) ){$ user-> getSfGuardUser() - > refresh(true); }這將顯着減少影響。結果將是證書更改和更新的權限之間的短暫延遲,但不需要註銷。 – lonesomeday 2010-09-21 17:07:55

1

感謝您的回答,我修改了sfGuardUser模塊操作類的processForm函數。

如果我登錄並更改我自己的權限,會話將在那裏更新。

我的問題是,如果我編輯另一個用戶的用戶權限,我需要編輯他們的會話數據。爲了解決這個問題,我啓用了數據庫會話,所以我現在有會話保存在那裏而不是文件。所以我的下一個問題是如何隔離其他用戶的會話。

會話數據庫包含以下列:sess_id,sess_data,sess_time。

sess_data被序列化,這就是我需要更新。

但我認爲symfony的經常更新的會話ID,這將是很難永遠隔離正確的會話的其他用戶。

我認爲,這也將是緩慢的嘗試和反序列化,檢查USER_ID然後重新序列化的數據。我想我需要一個user_id列。

0

我知道這是一個老問題,但最近,我有這個同樣的問題,我花了更長的路比它應該有找到答案(這是張貼在Symfony的代碼段部分)。在MYUSER類粘貼功能,所有的問題消失:

/** 
    * Overridden method that actually reads the permission from DB 
    * instead of relying on data present when the user logs in. 
    * 
    * @param string permission name 
    * 
    * @return boolean true if the user has credential 
    */ 
    public function hasCredential($permission_name) 
    { 
    if (!$this->isAuthenticated()) { 
     return false; 
    } 
    $gu = $this->getGuardUser(); 
    $groups = $gu->getGroups(); 
    $permissions = $gu->getPermissions(); 

    $permission_names = array(); 
    foreach($permissions as $permission) { 
     $permission_names[] = $permission->getName(); 
    } 
    foreach($groups as $group) { 
     $group_permissions = $group->getPermissions(); 
     foreach($group_permissions as $group_permission) { 
     $permission_names = array_merge($permission_names, array($group_permission->getName())); 
     } 
    } 
    $permission_names = array_unique($permission_names); 
    return (in_array($permission_name, $permission_names)) ? true : false; 
    } 
+0

爲什麼不在你的action preExecute()方法中調用'sfContext :: getInstance() - > getUser-> getGuardUser() - > refresh(true)'?我剛剛也遇到了這個問題,並且想知道自己處理之前你打過什麼牆。 – yellottyellott 2012-06-28 22:01:51