gpt4 book ai didi

security - 用户角色何时刷新以及如何强制刷新?

转载 作者:行者123 更新时间:2023-12-02 00:19:16 25 4
gpt4 key购买 nike

首先,我没有使用 FOSUserBundle,也不能使用,因为我正在移植一个遗留系统,该系统有自己的模型层(这里没有 Doctrine/Mongo/任何东西)和其他非常自定义的行为。

我正在尝试将我的旧角色系统与 Symfony 的连接起来,以便我可以在 Controller 和 View 中使用 native symfony 安全性。

我的第一次尝试是在 Symfony\Component\Security\Core\User\UserInterfacegetRoles() 方法中加载并返回所有用户角色。起初,这看起来似乎有效。但深入研究后,我注意到这些角色仅在用户登录时刷新。这意味着,如果我授予或撤销用户的角色,他将必须注销并重新登录才能使更改生效。但是,如果我撤销用户的安全角色,我希望立即应用该角色,因此我无法接受这种行为。

我希望 Symfony 做的是在每个请求上重新加载用户的角色,以确保它们是最新的。我已经实现了一个自定义用户提供程序,并且每个请求都会调用其 refreshUser(UserInterface $user) 方法,但角色不知何故并未刷新。

在我的 UserProvider 中加载/刷新用户的代码如下所示:

public function loadUserByUsername($username) {
$user = UserModel::loadByUsername($username); // Loads a fresh user object including roles!
if (!$user) {
throw new UsernameNotFoundException("User not found");
}
return $user;
}

(refreshUser 看起来很相似)

有没有办法让 Symfony 在每个请求上刷新用户角色?

最佳答案

经过几天的努力寻找可行的解决方案并为 Symfony2 用户邮件列表做出贡献,我终于找到了它。以下内容摘自 https://groups.google.com/d/topic/symfony2/NDBb4JN3mNc/discussion 的讨论

事实证明,有一个接口(interface) Symfony\Component\Security\Core\User\EquatableInterface 并不是用于比较对象身份,而是用于比较对象身份

test if two objects are equal in security and re-authentication context

在您的用户类中实现该接口(interface)(已经实现了UserInterface)。实现唯一必需的方法 isEqualTo(UserInterface $user),以便在当前用户的角色与传递的用户的角色不同时返回 false。

注意:User 对象在 session 中序列化。由于序列化的工作方式,请确保将角色存储在用户对象的字段中,并且不要直接在 getRoles() 方法中检索它们,否则所有这些都将不起作用!

以下是具体方法的示例:

protected $roles = null;

public function getRoles() {

if ($this->roles == null) {
$this->roles = ...; // Retrieve the fresh list of roles
// from wherever they are stored here
}

return $this->roles;
}

public function isEqualTo(UserInterface $user) {

if ($user instanceof YourUserClass) {
// Check that the roles are the same, in any order
$isEqual = count($this->getRoles()) == count($user->getRoles());
if ($isEqual) {
foreach($this->getRoles() as $role) {
$isEqual = $isEqual && in_array($role, $user->getRoles());
}
}
return $isEqual;
}

return false;
}

另请注意,当角色实际更改并且您重新加载页面时,分析器工具栏可能会告诉您您的用户未经过身份验证。另外,查看分析器,您可能会发现角色实际上并未刷新。

我发现角色刷新实际上确实有效。只是,如果没有遇到授权约束(没有 @Secure 注释、防火墙中没有所需的角色等),则刷新实际上不会完成,并且用户将保持在“未经身份验证”状态。

一旦您访问执行任何类型授权检查的页面,用户角色就会刷新,分析器工具栏会再次显示带有绿点的用户和“已验证:是”。

这对我来说是可以接受的行为 - 希望它有帮助:)

关于security - 用户角色何时刷新以及如何强制刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13798662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com