登录symfony2

时间:2013-03-24 21:23:25

标签: symfony

我正在尝试在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,创建了经过身份验证的用户,保存到令牌,然后作为经过身份验证的用户重定向到安全区域。不幸的是,我的代码以重定向循环结束,看起来安全防火墙不接受用户身份验证。你看到有什么问题吗?

2 个答案:

答案 0 :(得分:0)

嗯,你的控制器工作是渲染表单而不是填充安全上下文。 Symfony2安全防火墙将自动为您执行此操作。除非您想构建自己的custom authentication

,否则无需处理它
  

换句话说,您的工作是显示登录表单和任何登录信息   可能发生的错误,但安全系统本身需要   检查提交的用户名和密码   验证用户。

请阅读此document以获得清晰的图片。

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

答案 1 :(得分: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