我到处寻找,并尝试了一切,但我的重定向仍然不想工作。
我已经完成了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工作正常并且路由也是如此,但登录时重定向不
清除我的缓存也没有做到这一点。
答案 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。