根据FOSUserBundle

时间:2016-02-25 22:23:30

标签: php symfony

我到处寻找,并尝试了一切,但我的重定向仍然不想工作。

我已经完成了this问题答案的第二选项,但是想要的结果并没有出现。

这是我覆盖的登录功能(在/src/Acme/UserBundle/Controller/SecurityController.php)内;

class SecurityController extends BaseController
{
    public function loginAction(Request $request)
    {        
        /** @var $session \Symfony\Component\HttpFoundation\Session\Session */
        $session = $request->getSession();

        $authChecker = $this->container->get('security.authorization_checker');
        $router = $this->container->get('router');

        if ($authChecker->isGranted('ROLE_ADMIN')) {
            return new RedirectResponse($router->generate('admin_home'), 307);
        } 

        if ($authChecker->isGranted('ROLE_USER')) {
            return new RedirectResponse($router->generate('user_home'), 307);
        }
        ...
        ...
    }
}

我的AcmeUserBundle.php/src/Acme/UserBundle/包含以下代码;

namespace Acme\UserBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AcmeUserBundle extends Bundle
{
    public function getParent()
    {
        return 'FOSUserBundle';
    }
}

然后我的主要应用程序包AppBundle位于Acme /src/旁边,DefaultController.php位于/Controller/内,而我的管理控制器位于DefaultController.php } /Controller/Admin/

当我与角色为ROLE_USER的用户登录时,它会转到正确的位置。但是当我使用角色ROLE_ADMIN登录时,他会转到与ROLE_USER相同的位置。我们可以去管理页面。

这是我的security.yml文件;

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

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_token_generator: security.csrf.token_manager
            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: ^/, role: ROLE_USER }
        - { path: ^/admin, role: ROLE_ADMIN }

在我的项目的分析器中,正常注册的用户状态ROLE_USER的用户角色。我将用户在我的数据库中的角色修改为ROLE_ADMIN,当我与他一起登录时,两个角色都显示为分配给他。在我的数据库的role列下,这是查找分配给他ROLE_USER的用户的方式:

  

一个:0:{}

这就是我修改其他用户ROLE_ADMIN的方式:

  

一个:1:{I 0,S:10:" ROLE_ADMIN&#34 ;;}

这是对的吗?有人可以帮我解决这个问题吗?

注意:当我使用ROLE_USER用户登录并修改网址以进入/ admin /时,我会得到一个"表达式" has_role(' ROLE_ADMIN' )"拒绝访问。"错误。我明白了,那很好,因为我不想让普通用户访问该区域。但是当我使用ROLE_ADMIN用户登录并将URL修改为/ admin /时,它会转到该页面,因此我可以看到我的ROLES工作正常并且路由也是如此,但登录时重定向不

清除我的缓存也没有做到这一点。

2 个答案:

答案 0 :(得分:2)

我就这样做了......

// AppBundle\Security\LoginSuccessHandler.php

namespace AppBundle\Security;

use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Router;

class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface {

    protected $router;
    protected $authorizationChecker;

    public function __construct(Router $router, AuthorizationChecker $authorizationChecker) {
        $this->router = $router;
        $this->authorizationChecker = $authorizationChecker;
    }

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

        $response = null;
        if ($this->authorizationChecker->isGranted('ROLE_ADMIN')) {
            $response = new RedirectResponse($this->router->generate('admin'));
        } 

        return $response;
    }

}

然后将其添加到services.yml文件中:

authentication.handler.login_success_handler:
    class:  AppBundle\Security\LoginSuccessHandler
    arguments:  ['@router', '@security.authorization_checker']

我无法记住是否还有其他步骤。非常确定服务文件条目可以确保调用类。

答案 1 :(得分:1)

success_handler(至少)中有一个鲜为人知的form_login选项,在这里您可以找到一个完全符合您需求的gist with example usage