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