【问题标题】:Best practices/howto concerning users in security context安全上下文中有关用户的最佳实践/操作方法
【发布时间】:2015-03-12 08:04:18
【问题描述】:

我是 symfony 的新手,我想知道是否有人可以向我解释如何处理登录用户。我有一个类用户,它具有扩展用户的 3 个子类(管理员、编辑器、菜鸟)。这些用户可以登录首页,根据他们的用户类型,他们可以看到各种页面。 例如:有一个“更改密码”页面,可以更改用户的密码。管理员和编辑可以访问所有这些,但菜鸟只能更改自己的密码。所以我让 security.yml 中的路由对所有三个角色都可用:

- { path: ^/user/changepw, roles: [ROLE_ADMIN, ROLE_EDITOR, ROLE_NOOB }

在 changepwAction 中,我现在必须检查用户是否是 Noob,如果是,则当前 UserId 是否是他自己的。我想知道:我该怎么做?我需要在用户只能访问某些 ID 的各种控制器中检查这些内容。我开始时看起来像这样:

$securityContext = $this->container->get('security.context');
$loggedInUser = $securityContext->getToken()->getUser();
//if Noob (ID 3)
if($loggedInUser->getUserGroup()->getId() == 3) { ... }

这对我来说似乎非常不切实际,如果我以后必须添加用户组,我将不得不搜索每个控制器来编辑这些部分。我在想也许我可以创建一些全局可用的函数 checkUserRights($action, $options) 在其中我获取 currentLoggedInUser 并检查 $action (在这种情况下为“changepw”),如果允许用户,可能还有一些附加参数 $options使用此操作。这是一个好主意吗?如果是这样 - 我如何使 checkUserRights 全球可用?

如果不是 - 还能怎么做?我会感谢任何提示。

【问题讨论】:

标签: php symfony


【解决方案1】:

创建服务(YourBundle\Resources\config\config.xml 或 services.xml)

<service id="mycustom.security.interactive_login_listener" class="UserBundle\Security\InteractiveLoginListener">
    <argument type="service" id="service1" />
    <argument type="service" id="service2" />
    <tag name="kernel.event_listener" event="security.interactive_login" method="onSecurityInteractiveLogin" priority="1" />
</service>

创建您的监听器 (YourBundle\Security\InteractiveLoginListener):

class InteractiveLoginListener
{

    public function __construct()
    {
        //constructor    
    }

    /**
     * @param InteractiveLoginEvent $event
     */
    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
    {
        $user = $event->getAuthenticationToken()->getUser();
        /** @var User $user */

        if ($user instanceof UserInterface) {
            // do something    
        }
    }
}

【讨论】:

  • 我尝试实现这一点,但在我看来,只有在用户登录时才会调用 onSecurityInteractiveLogin - 我看不出这如何解决我在 changepwAction 中的问题
  • 你能添加文件路径的例子吗?我们不知道在哪里复制和粘贴这段代码。
【解决方案2】:

最后,我使用了 Voter 来执行此操作。所以我可以做类似 $securityContext->isGranted('USER_EDIT_PROFILES', $user)

虽然我不确定这是否是最好的解决方案,但事实上我似乎应该采取不同的做法:

Symfony - use voter in entityRepository

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 2015-01-30
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    相关资源
    最近更新 更多