2013-11-04 4 views
3

상당히 복잡한 응용 프로그램 논리를 저장할 최적의 장소와 관련하여 질문이 있습니다.로그인 기능을위한 애플리케이션 로직을 어디에 배치해야합니까?

사용자가 사이트에 로그인 할 수있게하려고합니다. (확인 사용자 가 존재 확인하기 위해 인증 테이블 인증 테이블 저장소를 사용자의 이메일 해시를 봐

  • 사용자의 이메일, 양식 필드에서

    1. 해시 : 로그인 과정은 다음 단계를 수반한다 암호화 된 이메일, 이메일 해시 266 및 암호 해시) 사용자가 발견되면
    2. 는, 다음의 유효성을 검사 암호
    3. 다시 생성 세션 ID
    4. 를 데이터베이스에 저장 새로운 세션

    데이터 매퍼 패턴을 사용하여, 나는 따라서이 과정

    /User/ 
    - User.php 
    - UserMapper.php 
    
    /Auth/ 
    - Auth.php 
    - AuthMapper.php 
    
    /Session/ 
    - Session.php 
    - SessionMapper.php 
    

    같은 것을 보일 것의 사용자를 기록하는 기능에 관련된 다음과 같은 세 가지 모델이 있습니다

    function login($email, $password) 
    { 
        $security = new \Lib\Security; 
        $authMapper = new \Models\Auth\AuthMapper($this->db); 
        $userMapper = new \Models\User\UserMapper($this->db); 
        $session = new \Models\Session\Session; 
        $sessionMapper = new \Models\Session\SessionMapper($this->db); 
    
        $email_hash = $security->simpleHash($email); 
    
        if (!$auth = $authMapper->fetchWhere('email_hash', $email_hash)) 
        { 
         echo 'User doesnt exist'; 
         return; 
        } 
    
        if (!$auth->verifyPassword($password)) 
        { 
         echo 'Password not correct'; 
         return; 
        } 
    
        $user = $userMapper->fetchById($auth->user_id); 
    
        $session->createUserSession($user); 
    
        $sessionMapper->save($session); 
    } 
    

    여기에 몇 가지 문제가 있습니다. 첫 번째는 의존성 주입이 없다는 것입니다. 두 번째는 로그인 기능을 제공하고자하는 모든 장소를 사용하는 번거로운 코드 덩어리입니다.

    그렇다면이 논리는 어디에 있어야합니까? 컨트롤러에서? 사용자 도메인 개체에서? 인증 도메인 개체에서? 그것은 일종의 원형으로 보입니다 - 데이터 맵퍼의 전체적인 점은 도메인 객체가 다른 객체는 말할 것도없고 자체의 지속성도 다루지 않기 때문입니다 ... 이것은 사용자 또는 인증 서비스 계층에 배치되어야합니다./사용자/또는/Auth/모델?

    나는 이런 종류의 일에 대한 모범 사례에 대해 약간 분실했다.

    또한 학습 목적으로 사용하니 Symfony와 같은 것을 사용하고 싶지는 않습니다.

  • 답변

    0

    내 자신의 질문에 대답하기 위해 나는 가장 좋은 장소는 LoginHandlerInterface 인터페이스를 생성자 인수로 허용하는 AccountController을 만드는 것이라고 결정했습니다.

    AccountController은 다음과 같습니다

    namespace App\Controllers; 
    
    class AccountController 
    { 
        protected $LoginHandler; 
    
        public function __construct(\Framework\Interfaces\LoginHandlerInterface $LoginHandler) 
        { 
         $this->LoginHandler = $LoginHandler; 
        } 
    
        public function login() 
        { 
         if (/* ... form validation stuff ... */) 
         { 
          try 
          { 
           $this->LoginHandler->login($email, $password); 
          } 
          catch (\Framework\Exceptions\Login $e) 
          { 
           // Assign login errors to template etc... 
          } 
         } 
        } 
    } 
    

    그럼,이 암호를 검증, (의 사용자를 찾는 로깅을 모두 수행하는 데 필요한 모든 세션을 업데이트를 가지고 사용하게 중 LoginHandler 기타). 이렇게하면 내 AccountController을 깨끗하고 유연하며 테스트 할 수 있습니다.

    생성자 종속성을 자동으로 확인하는 IoC 컨테이너의 구성을 통해 원하는 LoginHandler (및 여기에 표시되지 않은 RegistrationHandler)을 주입합니다.

    -1

    인증이 실패 할 경우 Auth는 false를 반환하고, true이면 을 반환하고 세션의 로직을 수행하고 true를 반환합니다.

    그래서 컨트롤러에 당신이 뭔가를 할 경우 (Auth-> 로그인 ($ 이메일, $ 암호))

    PS :이 유형의 작업을 위해, 내가 그것을 단위 유적 그래도 (싱글 톤 패턴을 사용하는 것을 선호 테스트),하지만 나는 그것이 당신에게 더 잘 어울릴 것이라고 생각합니다.

    +0

    다운 투표하면 왜 알려주십시오! 건배 –