我想关闭我的完整网站,只能访问经过身份验证的用户,但我想保留一些公开路由。公共路线是:
/
/消息
/注册
所有其他人都被锁定了。 我做了一个看起来像这样的防火墙:
firewalls:
user_login:
pattern: ^/
anonymous: ~
user_area:
pattern: ^/
form_login:
login_path: _main_index #this is a route to /
logout:
path: _main_logout #this is a route to /logout
target: _main_index #this is a route to /
invalidate_session: false
access_control:
- { path: ^/news, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/registration, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/user-panel, roles: ROLE_ACTIVE_USER } #is this neccessary?
然后,当我登录到受限区域(/用户面板)时,我需要完全验证自己。
我将我的角色存储在security.yml中,而不是存储在数据库中。
我希望你能帮助我!非常感谢你!
编辑: 我的loginCheckAction看起来像这样::
$encodedPassword = $this->get('user.user_service')->generatePasswordHash($user, $request->request->get('_password'));
if ($user->getPassword() == $encodedPassword) {
$user->setLastLoginOn(new \DateTime());
$this->em->user($rocker);
$this->em->flush();
$token = new UsernamePasswordToken($user, $user->getPassword(), 'user_area', array($user->getRoles()));
$request->getSession()->set('_security_user_area', serialize($token));
return $this->redirect($this->generateUrl('_user_panel'));
}
答案 0 :(得分:0)
您需要允许匿名令牌
user_area:
pattern: ^/
form_login:
login_path: _main_index #this is a route to /
logout:
path: _main_logout #this is a route to /logout
target: _main_index #this is a route to /
invalidate_session: false
anonymous: ~
答案 1 :(得分:0)
试试这个。
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/registration, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/news, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/(css|js), roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/(_wdt|_profiler), roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: ROLE_ACTIVE_USER }
我认为 login_check 在symfony安全系统内部使用,就像 logout 一样。这个空函数应该可以工作。
/**
* @Route("/login_check", name="login_check")
*/
public function loginCheckAction()
{
}
如果要在成功登录后将用户重定向到面板路由,则需要实现登录事件监听器。 Symfony文档How to create an Event Listener。
symfony loginlistener的一些资源。
答案 2 :(得分:0)
首先,主要问题之一是同一路线上的多重防火墙。
Symfony使用/ login route登录,/ login_check检查凭据和/ logout默认注销。对我来说,除了登录路线之外,所有路线都很好,因为我想从/ route登录用户。
因此,我必须将UserProviderInterface实现到我的UserRepository中,如下所示:Authenticating Someone with a Custom Entity Provider - Symfony2 documentation
我刚刚修改了这个(我用户名是用户名)。
Logincheck和logout自动运行,因为我使用默认路由。
对于所有这些,您必须实现AdvancedUserInterface到Users实体!!