用户权限更改后强制重新验证身份

9

在我的应用程序中,我可以在后台更改用户权限和角色。

当用户已登录并且我删除了用户的一个角色时,用户仍然可以访问他实际上没有权限访问的内容,因为他缺少该角色。更改只有在用户重新验证自己的注销/登录时才会生效。

因此,我的问题是,我可以访问已登录用户(不是我自己)的会话吗?我知道我可以访问并销毁自己的会话,这将强制我重新登录。但我想获取任何已登录用户的会话。这可能吗?我找不到任何相关资源。

我使用symfony2.1和fosuserbundle的PdoSessionStorage


这个问题也在这里提问过,但没有得到答案。http://stackoverflow.com/questions/14184484/how-to-administratively-invalidate-a-session-that-used-remember-me-option - MDrollette
@MDrollette 我觉得这个问题可能永远不会被回答。我认为唯一的解决方案可能是一个定制的会话管理器。 - DarkLeafyGreen
只需要将用户ID与会话ID一起存储在会话表中即可。听起来并不特别困难,但我也不确定最佳方法是什么。 - MDrollette
@MDrollette 我也在考虑同样的方法。我想我会尝试一下,并在这里发布更新。 - DarkLeafyGreen
2个回答

11
让你的用户类实现 Symfony\Component\Security\Core\User\EquatableInterface 接口。
如果从 isEqualTo() 方法返回 false,则用户将被重新验证。在这种情况下,使用该方法仅比较那些更改后应强制重新验证的属性 - 在您的情况下是角色。

+1 好的,我明白了。我需要在哪里进行这个检查?我需要在每个请求上都进行吗? - DarkLeafyGreen
只需让您的用户类实现该接口即可。您将被强制实现isEqualTo()方法。其余部分由Symfony处理。 - Elnur Abdurrakhimov

-1

你可以通过以下类似于我的方法来解决这个问题:

  1. 当用户登录时,将所有权限与这些权限的校验和一起存储在会话中。
  2. 将相同的校验和存储在数据库或磁盘上,并与该用户ID关联。
  3. 每当用户发出请求时,请验证磁盘上的校验和是否与该用户会话中的校验和相匹配。如果不同,则重新加载用户会话中的权限。
  4. 当更改权限时,请更新存储在与该用户相关联的数据库(或磁盘)中的校验和。这将在下一次请求时触发重新同步。

嗯,看起来很有趣,但也很复杂。这是你正在开发的某种帮助台吗? - DarkLeafyGreen
@artworkadシ 这并不是很复杂,它使用基本的Symfony2组件,如服务容器,安全上下文和请求对象来确定如何处理权限。 - JamesHalsall
@Jaitsu,Symfony内置的解决方案非常简单,你会开怀大笑的。请看我的回答。 ;) - Elnur Abdurrakhimov
@ElnurAbdurrakhimov 我的解决方案将会重新同步用户会话中的权限,但不会强制用户重新登录,虽然我从未听说过 EquatableInterface 的行为 :) - JamesHalsall
@Jaitsu,据我所知,EquatableInterface只是重新加载用户对象——而不强制用户重新登录。 - Elnur Abdurrakhimov
@ElnurAbdurrakhimov,从这个 Symfony\Component\Security\Core\Authentication\Token::setUser() 方法中我所能看到的就是在第 112 行调用了 setAuthenticated(false) 吗? - JamesHalsall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接