使用角色检查的 Symfony2 FOS 登录

Symfony2 FOS login with role check

我正在使用 Symfony FOS userBundle,除一件事外一切正常。

我想在用户登录时检查用户是否具有特定角色。如果不是这样,登录必须失败。有没有办法做到这一点?我搜索了一半的互联网,但找不到解决方案。

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_PARENT:      ROLE_USER
        ROLE_ADMIN:       ROLE_PARENT
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        main:
            pattern: ^/            
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider                

            logout:       true
            anonymous:    true
        mijn:
            pattern: ^/
            host: mijn.site
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
                #csrf_token_generator: security.csrf.token_manager
                # if you are using Symfony < 2.8, use the following config instead:
                # csrf_provider: form.csrf_provider

            logout:       true
            anonymous:    true
            
    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }
        
        - { host: mijn.site, path: ^/gegevens, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { host: mijn.site, path: ^/, roles: ROLE_PARENT }

所以只有用户ROLE_PARENT才能登录成功。如果它有 ROLE_ADMIN 或 ROLE_SUPERADMIN 没有 ROLE_PARENT.

,它一定会失败

我认为 FOSUserBundle 没有提供任何类似的东西,您也不需要。 您可以使用 Custom User Checkers。这是详细解释它的 doc。集成 UserChecker class 后,您可以使用自定义消息限制某人在 checkPreAuth 方法下登录。

一小段代码:

public function checkPreAuth(UserInterface $user)
{
    if (!in_array('ROLE_PARENT', $user->getRoles()) {
        $ex = new DisabledException('Only Parent Users are allowed to login!');
        $ex->setUser($user);
        throw $ex;
    }
}

在我的几个项目中有效。 希望对您有所帮助!

非常感谢,这有效!

记住:

  • 为此你至少需要 Symfony 2.8

  • 您需要为防火墙中的所有安全区域定义 user_checker