有没有办法从Symfony中具有特定子角色的用户中删除所有角色?

时间:2019-07-05 12:34:20

标签: php symfony security roles

我正在使用FosUserBundle,它提供了可以删除角色的功能。

$user->removeRole("ROLE_SUBSCRIBER_BASIC")

这很好,但我的主要问题是我想通过特定的子角色删除该角色。我在security.yml中的层次结构如下:

    ROLE_SUBSCRIBER: ROLE_USER
    ROLE_SUBSCRIBER_MONTHLY: [ROLE_SUBSCRIBER]
    ROLE_SUBSCRIBER_YEARLY: [ROLE_SUBSCRIBER]
    ROLE_SUBSCRIBER_BASIC:  [ROLE_SUBSCRIBER]
    ROLE_PRIVILEGE_PLUS: [ROLE_SUBSCRIBER]
    ROLE_SUBSCRIBER_PLUS:  [ROLE_PRIVILEGE_PLUS]
    ROLE_SUBSCRIBER_EXTRA:  [ROLE_PRIVILEGE_PLUS]

您可以看到PLUS,EXTRA和BASIC订户都是订户,因此我给了他们一个子角色“ ROLE_SUBSCRIBER”。 在我的取消订阅功能中,我想删除当前的订阅者角色,而不必使用if else循环,如下所示:

 public function unsubscribe(User $user)
    {
    if($user->hasRole("ROLE_SUBSCRIBER_BASIC")){
        $user->removeRole("ROLE_SUBSCRIBER_BASIC");
    }
    if($user->hasRole("ROLE_SUBSCRIBER_PLUS")){
        $user->removeRole("ROLE_SUBSCRIBER_PLUS");
    }
    if($user->hasRole("ROLE_SUBSCRIBER_EXTRA")){
        $user->removeRole("ROLE_SUBSCRIBER_EXTRA");
    }

...         }

这个if / else循环可以完成工作,但要考虑未来。如果我的老板希望有更多的订户角色,那我将不得不每次都编辑此功能并添加另一个IF。有没有更有效的方法可以做到这一点?就像通过按角色删除角色一样。

$user->removeRole("ROLE_SUBSCRIBER")

这样,它将自动删除ROLE_SUBSCRIBER_EXTRA,ROLE_SUBSCRIBER_BASIC,... MONTHLY,... YEARLY或... PLUS,而无需我检查用户当前具有哪种订阅!!

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

const KEEP_ROLES = ['ROLE_ADMIN'];

$rolesToRemove = array_diff($user->getRoles(), KEEP_ROLES);

foreach ($rolesToRemove as $role) {
   $user->removeRole($role);
}