Symfony2:如何实现自定义用户登录&注册 - 摆脱FOSUSerBundle

时间:2015-01-08 14:01:10

标签: php symfony login registration fosuserbundle

我正在尝试摆脱FOSUserBundle,因为我想实现一个与我的用户建立多种关系的角色实体。

所以我的问题是:是否会有一步一步的教程来替换这个FOSUserBundle?如果没有,有人可以至少通过我需要实施的元素来指导我,因为我觉得我总是忘记了一些事情。

到目前为止,我有:

  1. 类User实现AdvancedUserInterface,\ Serializable
  2. 类UserProvider实现UserProviderInterface
  3. 具有公共函数registerAction的控制器(Request $ request) 处理将用户保存在数据库中。
  4. 在这里,我可以保存用户,并且我看到保存了盐,密码,用户名和电子邮件,但在处理完请求后,我什么也得不到,并且无法登录。

    我是否还需要实施:

    1. 自定义身份验证提供程序
    2. 或用户API密钥
    3. 如果是,哪一个?

      接下来?

      我的注册码:为什么没有调用return语句?

      /**
       * @Route("/register_user", name="register_user")
       * @Method({"GET","POST"})
       * @param Request $request
       * @param bool $extendLayout
       * @return null|\Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
       */
      public function registerAction(Request $request, $extendLayout=true)
      {
          $formManager = $this->get('form_manager');
          $user = new User();
          $user->setEnabled(true);
      
          $form = $formManager->createForm(new UserRegistrationType(), $user, 'POST', 'register_user',null, false);
      
          if ($request->getMethod() == 'POST')
          {
              if ($formManager->handleRequestAndValidate($form))
              {
      
                  $userSecurityManager = $this->get('user_security_manager');
                  $userSecurityManager->updateUser($user, true);
      
                  //This return won't get called, is there an eventlistener on the register event ?
                  return $this->redirect($this->generateUrl('registration_confirmed'));
      
              }
          }
      
          $layout = $extendLayout == true ? 'User/Registration/register.html.twig' : 'User/Registration/register_content.html.twig';
      
          return $this->render($layout, array(
                  'form' => $form->createView(),
              ));
      }
      

      我的登录表单被发送到login_check路由,我相信symfony正在处理这个路由,并且我正在创建的用户登录失败。为什么?

      我的登录表单:

      <div class="fmu_panel fmu_login">
      
          <h3>Vous êtes inscrit</h3>
      
          <div class="panel-content">
              <form action="{{ path("login_check") }}" id="signup-form_id" method="post">
                  <input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />
      
                  {% if error %}
                      <div class="form-group">
                      <div class="alert alert-danger" role="alert">
                          {#{{ error.messageKey|trans(error.messageData, 'security') }}#}
                          Mot de passe ou nom d'utilisateur incorrect.
                      </div>
                      </div>
                  {% endif %}
      
                  <div class="form-group w-icon">
                      <input type="text" id="username" name="_username" value="{{ last_username }}" required="required" class="form-control" placeholder="E-mail ou pseudo" />
                      <i class="fa fa-user"></i>
                  </div> <!-- / Username -->
      
                  <div class="form-group w-icon">
                      <input type="password" id="password" name="_password" required="required" class="form-control" placeholder="Mot de passe"  />
                      <i class="fa fa-lock"></i>
                  </div> <!-- / Password -->
      
                  <div class="form-group">
                      <label for="_remember_me" class="checkbox-inline">
                          <input type="checkbox" name="_remember_me" id="remember_me" checked>
                          Se souvenir de moi
                      </label>
                  </div>
      
                  <div class="form-actions">
                      <input type="submit" value="S'identifier" class="btn btn-primary" name="_submit" id="fmu_signin">
                      <a href="#" class="forgot-password btn btn-danger pull-right" id="fmu_forgot_password_link">Mot de passe oublié ?</a>
                  </div>
      
      {#
                  <div class="social">
                      <a href="{{ path('hwi') }}twitter" class="btn btn-default">Se connecter avec <span>Facebook</span></a>
                  </div>
      #}
      
              </form>
      
              <div id="fmu_password_reset">
      
                  {{ render(controller('AppBundle:User/UserSecurity:requestNewPassword')) }}
      
              </div>
          </div>
      </div>
      
      
      
      <script>
      
      // Show/Hide password reset form on click
      
      $(function(){
          $('#fmu_forgot_password_link').on('click', function (e) {
              e.preventDefault();
              $('#fmu_password_reset').fadeIn(400);
              $('#signup-form_id').fadeOut(400);
          });
          $('#fmu_password_reset .close').click(function (e) {
              e.preventDefault();
              $('#fmu_password_reset').fadeOut(400);
              $('#signup-form_id').fadeIn(400);
          });
      
      });
      </script>
      

1 个答案:

答案 0 :(得分:0)

您可以按照教程进行操作: How to Load Security Users from the Database

基本上你需要:

  • 自定义用户类(您有
  • 配置Symfony Security组件(可能缺少
  • 可选)自定义用户提供商

以下是上述教程中的security.yml示例:

# app/config/security.yml
security:
    encoders:
        AppBundle\Entity\User:
            algorithm: bcrypt

    # ...

    providers:
        our_db_provider:
            entity:
                class: AppBundle:User
                property: username
                # if you're using multiple entity managers
                # manager_name: customer

    firewalls:
        default:
            pattern:    ^/
            http_basic: ~
            provider: our_db_provider

    # ...

您的登录表单似乎是正确的,因此它应该使用正确的安全配置。