php - 有关安全环境中用户的最佳实践/操作指南

标签 php symfony

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

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

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

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

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

如果不是 - 还能怎么做?我将不胜感激任何提示。

最佳答案

创建服务(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    
        }
    }
}

关于php - 有关安全环境中用户的最佳实践/操作指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27937853/

相关文章:

php - 从 MySQL 中的 BINARY 列检索数据并将其转换为 PHP 中的 Base64

PHP72 MongoDB 驱动程序与 OSX 上的 Homebrew

php - Symfony 3 和 Mailhog : mails not being cached by mailhog

php - CodeIgniter 第三方类未加载

php - 确保给定列表中只有一个 bool 值是真的?

php - 创建独特的页面标题 slugs php

Symfony2,如何创建像独立类一样的小部件

Heroku 上的 Symfony 产生 500 Internal server error 但没有消息

php - Twig ,获取源码

apache - 将 .htaccess 导入 IIS URL 重写 Web.Config 时出现问题