2014-06-10 1 views
1

저는 젠드 프레임 워크 2를 처음 접했고 인증을 처리하는 가장 좋은 방법이 무엇인지 궁금합니다. 나의 현재 (일) 로그인 코드는 다음과 같습니다 젠드 프레임 워크 2의 인증을 처리하는 가장 좋은 방법

public function loginAction() 
{ 
    $message = ''; 
    $message_type = ''; 

    $form = new UserForm(); 
    $form->get('submit')->setValue('login'); 

    $request = $this->getRequest(); 
    if($request->isPost()) 
    { 
     $data = $request->getPost(); 
     $user = $this->getUserTable()->getUser($data['username']); 

     $bcrypt = new Bcrypt(); 
     if($bcrypt->verify($data['password'], $user->password)) 
     { 
      $message = 'successfully logged in as ' . $user->username; 
      $message_type = 'success'; 
     } 
     else 
     { 
      $message = 'invalid password or username'; 
      $message_type = 'danger'; 
     } 
    } 

    return new ViewModel(array(
     'form' => $form, 
     'message' => $message, 
     'message_type' => $message_type, 
    )); 
} 

지금 나는 내가 ZF2 인증 모듈을 사용하지 않는 알고 있지만 나는 Bcrypt 작업을 얻을 수 없습니다. 내 방법은 충분히 안전합니까? 아니면 Zend \ Authentication을 사용해야합니까?

편집

가 좋아, 내가 어떻게 든 작동하도록 관리, 여기에 새로운 코드 : 그것은 BCrypt와 젠드 \ 인증을 사용

public function loginAction() 
{ 
    $message = ''; 
    $message_type = ''; 

    $form = new UserForm(); 
    $form->get('submit')->setValue('login'); 

    $request = $this->getRequest(); 
    if($request->isPost()) 
    { 
     $user = new User(); 
     $form->setInputFilter($user->getInputFilter()); 
     $form->setValidationGroup('username', 'password'); 
     $form->setData($request->getPost()); 

     if($form->isValid()) 
     { 
      $user->exchangeArray($form->getData()); 
      $data = $this->getUserTable()->getUser($user->username); 

      $bcrypt = new Bcrypt(); 
      if($bcrypt->verify($user->password, $data->password)) 
      { 
       $dbAdapter = $this->getServiceLocator()->get('Zend\Db\Adapter\Adapter'); 
       $authService = new CredentialTreatmentAdapter($dbAdapter, 'user', 'username', 'password'); 
       $authService->setIdentity($user->username); 
       $authService->setCredential($data->password); 

       if($authService->authenticate()->isValid()) 
       { 
        $message = 'successfully logged in as ' . $user->username; 
        $message_type = 'success'; 
       } 
       else 
       { 
        $message = 'invalid password or username'; 
        $message_type = 'danger'; 
       } 
      } 
     } 
    } 

잘 작동하는 것 같다.

답변

1

"그러나 나는 Bcrypt 작업을 얻을 수 없다"

    이미
  1. 변수화 사용자 이름과 bcrypted 암호로 인증 어댑터 bcrypted
  2. 암호 저장

(문자열을 비교하면됩니다.)

"내 방법이 안전하거나 Zend \ Authentication을 사용해야합니까? " 암호를 저장하는 경우 암호를 사용하는 데 아무런 문제가 없습니다.

그럼에도 불구하고 Zend Authentication : Zend\Authentication을 사용합니다.

0

그것은 밖으로 세션 스토리지 나를 위해 노력하고 있습니다

public function login($credential) 
    { 
    $bcrypt = new Bcrypt(); 
    $user = new User(); 
    $user->exchangeArray($credential); 

    $password = $user->password; 
    $data  = $this->getUserTable()->selectUser($user->username); 

    if (!$data) 
    { 
     $message = 'Username or password not correct!'; 
    } else { 

     if ($bcrypt->verify($password, $data->password)) { 

      $sm   = $this->getServiceLocator(); 
      $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
      $authAdapter = new AuthAdapter(
        $dbAdapter, 
        'user', 
        'username', 
        'password' 
      ); 
      $authAdapter -> setIdentity($user->username) -> setCredential($data->password); 
      $auth = new AuthenticationService(); 
      $result = $auth->authenticate($authAdapter); 
      //success 
       switch ($result->getCode()) { 
        case Result::FAILURE_IDENTITY_NOT_FOUND: 
         // do stuff for nonexistent identity 
         $message = "FAILURE_IDENTITY_NOT_FOUND"; 
         break; 

        case Result::FAILURE_CREDENTIAL_INVALID: 
         // do stuff for invalid credential 
         $message = "FAILURE_CREDENTIAL_INVALID"; 
         break; 

        case Result::SUCCESS: 

         $message = "you are logged in succesfully"; 
         break; 

        default: 
         // do stuff for other failure 
         //$message = "you are logged in succesfully"; 
        break; 
       //$message = "Login succesfull.Welcome ".$auth->getIdentity(); 

      } 
     } else { 
      $message = 'Username or password not correct'; 
     } 
    } 


    return new ViewModel(array("message" =>$message)); 
} 
관련 문제