我是symfony的新手,我想知道是否有人可以向我解释如何处理登录用户。我有一个类用户,有 3 个子类(管理员、编辑器、菜鸟)来扩展用户。这些用户可以在首页上登录,并且根据他们是哪种用户类型,他们可以看到各种页面。例如:有一个"更改密码"页面,可以在其中更改用户的密码。管理员和编辑可以访问所有这些,但菜鸟只能更改自己的密码。因此,我使 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),在其中我获取当前日志InUser 并检查$action(在这种情况下为"changepw")以及一些额外的参数$options是否允许用户使用此操作。这是一个好主意吗,如果是这样 - 我如何使用户权利查核在全球范围内可用?
如果没有 - 否则如何做到这一点?我会感谢任何提示。
创建一个服务 (YourBundle''Resources''config''config.xml or 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
}
}
}
最后我用了一个选民来做这件事。所以我可以做一些类似$securityContext->isGranted('USER_EDIT_PROFILES',$user)
我不确定这是否是最好的解决方案,事实上,我似乎应该以不同的方式做:
Symfony - 在 entityRepository 中使用 voter