2015-01-08 53 views
4

我想摆脱FOSUserBundle,因为我想实现一个角色实体链接在与我的用户manytomany关系。Symfony2:如何实现自定义用户登录和注册 - 摆脱FOSUSerBundle

所以我的问题是:会有一步一步教程来取代这个FOSUserBundle?如果没有,有人可以引导我至少通过我需要实现的因素,因为我觉得我总是忘记了一些东西。

到目前为止,我有:

  1. 类用户实现AdvancedUserInterface,\序列化
  2. 类UserProvider实现UserProviderInterface
  3. 具有公共职能registerAction(请求$要求)控制器 办理储蓄数据库中的用户。

在这里,我可以保存用户,我看到盐,密码,用户名和电子邮件都保存,但处理请求后,我什么也得不到,登录是不可能的。

我需要同时实现:

  1. 自定义身份验证提供
  2. 或用户API密钥

如果有,是哪一个?

然后呢?

我的注册码:为什么没有调用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(), 
     )); 
} 

我的登录表单发送到我相信symfony中被处理,登录失败,我创建用户login_check路线。为什么?

我的登录表单:

<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> 
+0

您的'exit'调用是在函数返回之后,因此它永远不会被调用。 –

+0

是的,当然,对不起。我忘了提及'registration_confirmed'控制器开始处的相同出口未打印出来。所以实际上这是没有被调用的回报。是否有注册事件的事件监听者? –

+0

它看起来并不像是在保存新用户。它实际上是否填充到数据库中?你最好的选择是检查日志或者是否进入if语句。 –

回答

0

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


基本上你需要:

  • 自定义用户类(你有
  • 配置Symfony的安全组件(可能丢失
  • 可选)自定义用户提供商

这里是上面提到的教程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 

    # ... 

登录形式似乎是正确的,所以应该用正确的安全配置工作。