安全上下文中有关用户的最佳实践/方法

时间:2015-01-14 07:34:42

标签: php symfony

我是symfony的新手,我想知道是否有人可以向我解释如何处理使用登录的用户。我有一个类用户,有3个子类(Admin,Editor,Noob),可以扩展用户。这些用户可以登录首页,根据他们的用户类型,他们可以看到各种页面。 例如:有一个"更改密码"页面,可以更改用户的密码。管理员和编辑可以访问所有这些,但Noob只允许更改自己的密码。所以我在security.yml中创建了可用于所有三个角色的路由:

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

在changepwAction中,我现在必须检查用户是否是菜鸟,如果是,那么当前的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全球可用?

如果没有 - 这怎么可能呢?我要感谢任何提示。

2 个答案:

答案 0 :(得分: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    
        }
    }
}

答案 1 :(得分:1)

最后我用Voter来做这件事。所以我可以做一些像$ securityContext-&gt; isGranted(&#39; USER_EDIT_PROFILES&#39;,$ user)

我不确定这是否是最佳解决方案,事实上我似乎应该采用不同的方式:

Symfony - use voter in entityRepository