如何使用symfony2安全性实现自定义编码

时间:2013-12-05 00:37:15

标签: security symfony authentication doctrine-orm blowfish

所以我遇到的问题如下: 目前,我所拥有的symfony2项目有一个用户实体,它有自己的方法来加密数据库中的密码:

private function blowfishCrypt($password,$cost)
{
    $chars='./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    $salt=sprintf('$2a$%02d$',$cost);
    //Create a 22 character salt -edit- 2013.01.15 - replaced rand with mt_rand
    mt_srand();
    for($i=0;$i<22;$i++) $salt.=$chars[mt_rand(0,63)];
    return crypt($password,$salt);
}

public function encryptPassword($string)
{
    $this->setEncryptedPassword($this->blowfishCrypt($string, 10));
}

登录方法基本上只检查输入的密码,如下所示:

if (crypt($userPost['password'], $user->getEncryptedPassword()) != $user->getEncryptedPassword())

然后设置会话变量authTokenuserId

但由于这一点,在整个应用程序中必须进行调用以确保在会话中设置userId和authToken - 因此我们希望经过身份验证的用户只能访问的任何操作我们必须执行以下检查:

if (!authToken) { return 401 } //not exactly, but you get the idea.

我清理所有这些检查的临时解决方案是创建一个接口,我的所有控制器都可以实现在控制器操作之前运行一些代码,并且如果用户没有登录则可以返回重定向。我想要什么要做的就是重写所有这些,以便我可以利用symfony2的安全层。我怎么能做到这一点?

编辑:我有一个单独的门户网站,它运行在相同的代码库中,为用户使用完全不同的表(如管理门户)。假设上述情况可能,symfony2的安全功能是否可以实现?

编辑2:试图将这一切全部集成,所以我认为第一步是在我的用户实体中实现UserInterface。我已经做到了,这是我的security.yml:

security:
  firewalls:
    secured_area:
      pattern: ^/
      anonymous: ~
      form_login:
        login_path: login
        check_path: login_check
  access_control:
    - { path: ^/., roles: IS_AUTHENTICATED_FULLY }
    - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/login.*, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/login_check.*, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/signup.*, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/_wdt, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/_profiler, role: IS_AUTHENTICATED_ANONYMOUSLY }
  providers:
    main:
      entity:
        class: BundleNamespace\Entity\User
        property: email
  encoders:
    Symfony\Component\Security\Core\User\User: plaintext

我得到一个无限循环。基本上我需要用户能够访问/,/登录,/注册等,而无需登录。几乎每个其他页面都需要经过身份验证的用户。我还没有得到自定义密码编码器,我认为这将是我的最后一步。我想通过这个重定向循环问题。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

你必须使用自定义编码器,而不是在用户权利之上放置自制物......

看看:https://stackoverflow.com/a/8175657/2858398

然后,您可以使用本机symfony连接方法与自定义密码编码器。

答案 1 :(得分:0)

不想过多细节,因为这是一个非常艰苦的转换过程。我唯一的建议是 - 从头开始​​做这类事情,让自己头疼。