Symfony2 FOS登录角色检查

时间:2016-08-06 10:35:05

标签: symfony fosuserbundle roles

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

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



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 }
&#13;
&#13;
&#13;

因此,只有用户拥有ROLE_PARENT时才能成功登录。如果ROLE_ADMIN或ROLE_SUPERADMIN没有ROLE_PARENT,它必须失败。

2 个答案:

答案 0 :(得分:1)

我不认为FOSUserBundle提供任何东西,你不需要。 您可以使用Custom User Checkers。这是doc,详细解释了它。在集成UserChecker课程后,您可以使用自定义消息限制某人使用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;
    }
}

适用于我的几个项目。 希望它有所帮助!

答案 1 :(得分:0)

Thanx很多,这很有用!

记住:

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