Symfony 4 安全重定向取决于用户类型

Posted

技术标签:

【中文标题】Symfony 4 安全重定向取决于用户类型【英文标题】:Symfony 4 Security Redirect depending user type 【发布时间】:2020-10-24 21:11:43 【问题描述】:

我正在做一个网站,这个网站将有两种类型的用户“客户”(customers)和“员工”(员工) 这两个类都在扩展我的用户类:

我的客户类

/**
 * @ORM\Entity(repositoryClass="App\Repository\ClientRepository")
 */
class Client extends User

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $client_fonction;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ClientEmployee", mappedBy="client_id")
     */
    private $client_id;

    /**
     * @ORM\ManyToOne(targetEntity=Site::class, inversedBy="clients")
     */
    private $site;

我的员工班级

/**
 * @ORM\Entity(repositoryClass="App\Repository\EmployeRepository")
 */
class Employe extends User

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @ORM\Column(type="integer", nullable=true)
     */
    private $portablePro;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Agence", inversedBy="agence_id")
     * @ORM\JoinColumn(nullable=false)
     */
    private $agence_spie_id;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ClientEmployee", mappedBy="employe_id")
     */
    private $employe_id;

这是我在用户类中的继承映射:

/**
 * @ORM\Entity(repositoryClass=UserRepository::class)
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap("Employe"="Employe", "Client"="Client")
 */
abstract class User implements UserInterface

我正在寻找方法: 如果用户是“客户”-> 重定向到 /client 路由 如果用户是“雇员” -> 重定向到 /admin 路由。

在我的 security.yaml 中,我设置了 2 个提供者:

providers:
    chain_provider:
        chain:
            providers: [app_employe_provider, app_client_provider]
    app_employe_provider:
        entity:
            class: App\Entity\EmployeSpie
            property: email
    app_client_provider:
        entity:
            class: App\Entity\Client
            property: email

role_hierarchy:
    ROLE_CUSTOMER:
    ROlE_IA :
    ROLE_ADV :
    ROLE_CM :
    ROLE_RT :
    ROLE_ADMIN:
    ROLE_SUPER_ADMIN: ROLE_ADMIN
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
      -  path: ^/admin, roles: ROLE_ADMIN 
      -  path: ^/client, roles: ROLE_CUSTOMER 

如何在我的 LoginFormAuthenticator 中,根据用户的类型重定向用户?

public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)

    if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) 
        return new RedirectResponse($targetPath);
    

    // For example : return new RedirectResponse($this->urlGenerator->generate('some_route'));
    throw new \Exception('TODO: provide a valid redirect inside '.__FILE__);

【问题讨论】:

【参考方案1】:

由于令牌作为参数传递,因此您可以从那里提取用户(类型)。

public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)

    $user = $token->getUser();
    if($user instanceof Employe) 
        // Do one thing
     else if($user instanceof Client) 
        // Do other thing.
    

【讨论】:

以上是关于Symfony 4 安全重定向取决于用户类型的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 安全重定向到登录页面

使用 FOS 用户 Symfony 4 登录后重定向问题

Symfony 4 Fos用户在不同路径上重定向

在验证用户与 Symfony 4 和 FOSUserBundle 连接后重定向用户

Symfony 安全返回 401 响应而不是重定向

如何在Symfony 4.1中禁用尾部斜杠重定向?