我正在使用 symfony 1.4 和 sfGuardDoctrinePlugin,我已经安装并设置得很好,但我遇到了以下问题:
如果我以管理员身份登录并更新用户的权限,则该用户必须注销然后再次登录,然后才能获得新添加的凭据/权限。
有没有解决的办法?
我不确定这将是多么容易解决。当用户登录时,我认为他们的凭据会被添加到他们的会话属性中。因此,当管理员更新他们的凭据时,他们的会话仍然保留旧凭据。这意味着对 hasCredential 的任何调用都不是“实时”的。
谢谢
这将为您的应用程序的每个请求添加额外的查询。您可以通过 强制更新凭据$user->getSfGuardUser()->refresh(true)
,这将重新加载实体及其所有关系(以及它的权限)。
感谢您的回答,我已经修改了 sfGuardUser 模块的操作类的 processForm 函数。
如果我登录并更改我自己的权限,会话就会在那里更新。
我的问题是,如果我编辑另一个用户的用户权限,我需要编辑他们的会话数据。为了解决这个问题,我启用了数据库会话,所以我现在将会话保存在那里而不是文件。所以我的下一个问题是如何为其他用户隔离会话。
会话数据库具有以下列:sess_id、sess_data、sess_time。
sess_data 已序列化,这就是我需要更新的内容。
但我认为 symfony 会经常更新会话 ID,并且很难始终为其他用户隔离正确的会话。
我认为尝试反序列化也会很慢,检查 user_id 然后重新序列化数据。我认为我需要一个 user_id 列。
我知道这是一个老问题,但我最近遇到了同样的问题,我花了比它应该找到答案的时间更长的时间(发布在 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;
}