2013-03-24 73 views
2

我试图在Symfony2中实现非常基本的身份验证。以下是代码的主要部分我实在看不出有什么问题登录symfony2

编辑 完整security.yml

jms_security_extra: 
    secure_all_services: false 
    expressions: true 

security: 
    encoders: 
     Symfony\Component\Security\Core\User\User: plaintext 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

    providers: 
     in_memory: 
      memory: 
       users: 
        user: { password: userpass, roles: [ 'ROLE_USER' ] } 
        admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] } 

    firewalls: 
     login: 
      pattern: ^/login 
      anonymous: ~ 

     secured_area: 
      pattern: ^/ 
      stateless: true 
      form_login: 
       login_path: /login 
       check_path: /login_check 

    access_control: 
     - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/, roles: ROLE_USER }  

这工作得很好,匿名用户总是重定向到在loginAction控制器。

编辑 下面是完整的代码

<?php 

namespace AcmeBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; 

class SecurityController extends Controller { 

    public function loginAction() { 

     $providerKey = 'secured_area'; 
     $token = new UsernamePasswordToken('test', 'test', $providerKey, array('ROLE_USER')); 
     $this->container->get('security.context')->setToken($token); 

     return $this->redirect($this->generateUrl('fronthomepage')); 

    } 
} 

我看不出有什么问题,匿名用户被重定向到的LoginAction,有创建身份验证的用户,保存令牌,比重定向到作为认证用户的安全区域。不幸的是,我的代码以重定向循环结束,看起来像安全防火墙不接受用户身份验证。你有没有看到任何问题?

+1

,能不能请你倾倒所有security.yml代码和所有的控制器代码。 – 2013-03-24 21:25:29

回答

0

那么,你的控制器工作是渲染只是形式,而不是填充安全上下文。 Symfony2安全防火墙会自动为你做到这一点。除非你想建立你自己的custom authentication,否则你不需要处理它。

换句话说,你的工作是显示登录表单,并可能已发生的任何登录 误差,但安全体系本身需要检查提交的用户名和密码, 认证用户的 照顾。

请看这document清晰的图片。

如果你想在用户登录时做一些自定义的事情,在Symfony2中你必须添加一个事件监听器,在用户成功登录后触发事件。被触发的事件是security.interactive_login并且为你挂钩必须在services.yml文件中指定这个你的包的文件Resources/config目录:

+0

谢谢你的回应。我需要没有登录表单的身份验证。身份验证将基于URL启动独立于symfony的第三方身份验证。我需要的是有能力手动创建用户。我正在阅读自定义身份验证,它看起来像这样一个小任务真正的大解决方案。 – jros 2013-03-25 08:18:46

+0

啊好的。我接到你了。但是你正在验证的测试用户没有在providers-> in_memory-> users列表中定义。所以,重定向是无限的。试试这个,$ token = new UsernamePasswordToken('user','userpass',$ providerKey,array('ROLE_USER')); – Venu 2013-03-25 08:24:39

+0

我改变了这一行,并以重定向循环结束。匿名用户被重定向到登录控制器,它在那里创建用户令牌,但是由于防火墙不认为用户被认证,下一次重定向失败。它看起来像我的令牌没有保存。我已经尝试将它保存到会话中,像这样$ this-> container-> get('request') - > getSession() - > set('_security_secured-area',serialize($ token)),但它不是更好 – jros 2013-03-25 08:59:02

0

很确定你需要一个实际的用户对象,然后设置一个经过身份验证的用户。我做了这样的事情:

class BaseController 

protected function setUser($userName) 
{ 
    if (is_object($userName)) $user = $userName; 
    else 
    { 
     $userProvider = $this->get('zayso_core.user.provider'); 
     // Need try/catch here 
     $user = $userProvider->loadUserByUsername($userName); 
    } 
    $providerKey = 'secured_area'; 
    $providerKey = $this->container->getParameter('zayso_core.provider.key'); // secured_area 

    $token = new UsernamePasswordToken($user, null, $providerKey, $user->getRoles()); 
    $this->get('security.context')->setToken($token); 
    return $user; 
} 

但是做这样的事情绕过了很多安全系统,不建议。我也想使用第三方认证系统(Janrain)。我查看了认证系统,最初无法使其正面或反面。这是在食谱条目存在之前。

我知道这看起来有点矫枉过正,但是一旦你完成了一些事情,那么它就会变得更有意义。你可以访问一些漂亮的安全功能。我花了相当长的一段时间才开始了解认证系统,但最终还是值得的。

提示: 1.向后翻阅烹饪书。我真的很难理解发生了什么,但我开始在security.yml中添加一个新的防火墙,然后为我的安全工厂添加别名。然后,我逐一了解了工厂被要求做的事情。从那里我听到了听众的声音,并再次通过电话。最后,认证管理器开始发挥作用。再次耗费时间,但最终值得。学到了很多。

  1. 让我发疯的一件事是,班级分散到各地。命名留下了一些需要的东西。很难得到一个概述。我最终制作了自己的身份验证包,然后将所有内容置于安全状态

  2. 如果你想有一个工作包的另一个例子然后看看:https://github.com/cerad/cerad/tree/master/src/Cerad/Bundle/JanrainBundle