2014-04-25 2 views
1

인증/권한 구현을 위해 guide을 따라했으며 로그인 할 수 있습니다. 가이드의 내용과는 다른 주요 차이점이 있습니다. isActive 속성 대신 내 데이터베이스에 상태 테이블이 있습니다.Symfony2 사용자 정의 상태 기반의 사용자 로그인 거부

가이드에 언급 된 isActive 속성 대신 상태 테이블의 값을 기반으로 로그인을 거부/허용하는 방법에 대한 손실이 있습니다.

가이드에 나와있는대로 작동하기 때문에 어떤 코드를 게시해야할지 모르겠지만 Symfony 보안 시스템은 내가 볼 수없는 모든 인증 작업을 처리합니다.

올바른 방향으로 나를 가리키더라도 나는 감사 할 것입니다.

편집 :

public function isAccountNonExpired() 
    { 
     $status = $this->getTblStatus()->getStatustext(); 

     switch ($status){ 
      case "expired": 
       return false; 
      default: 
       return true; 
     } 
    } 

    public function isAccountNonLocked() 
    { 
     $status = $this->getTblStatus()->getStatustext(); 

     switch ($status){ 
      case "locked": 
       return false; 
      case "suspended": 
       return false; 
      case "registered": 
       return false; 
      default: 
       return true; 
     } 
    } 

    public function isCredentialsNonExpired() 
    { 
     return $this->pwdexpired; 
    } 

    public function isEnabled() 
    { 
     $status = $this->getTblStatus()->getStatustext(); 

     if($status != 'active') 
      return false 
     else 
      return true; 
    } 

그때가 다음 질문은 내가 던져 예외를 어떻게 처리하나요 경우 : AdvancedUserInterface 기능을 구현하기 위해이 코드를 내놓았다 ChadSikorra의 조언을 사용

사용자가 상태 중 하나를 가지고있을 때?

내가 지금까지 가지고있는 것을 바탕으로 loginAction의 오류를 잡아 내면이 문제를 해결할 수 있다고 생각합니다. 어떻게 해야할지 모르겠지만 오류를 확인하는 것이지만 계속 파고 갈 것입니다.

/** 
    * @Route("/Login", name="wx_exchange_login") 
    * @Template("WXExchangeBundle:User:login.html.twig") 
    * User login - Open to public 
    * Authenticates users to the system 
    */ 
    public function loginAction(Request $request) 
    { 
     $session = $request->getSession(); 

     if ($this->get('security.context')->isGranted('IS_AUTHENTICATED_REMEMBERED')) 
     { 
      // redirect authenticated users to homepage 
      return $this->redirect($this->generateUrl('wx_exchange_default_index')); 
     } 

     // get the login error if there is one 
     if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) { 
      $error = $request->attributes->get(
       SecurityContext::AUTHENTICATION_ERROR 
      ); 
     } else { 
      $error = $session->get(SecurityContext::AUTHENTICATION_ERROR); 
      $session->remove(SecurityContext::AUTHENTICATION_ERROR); 
     } 

     if($error instanceof LockedException) 
    { 
    } 

     return $this->render(
      'WXExchangeBundle:User:login.html.twig', 
      array(
       // last username entered by the user 
       'last_username' => $session->get(SecurityContext::LAST_USERNAME), 
       'error'   => $error, 
      ) 
     ); 
    } 

는 이제 예외의 종류를 확인 할 수 있어요,하지만 난 올바른 위치로 리디렉션 할 수 있도록 나는 특정 상태를 확인하는 방법에 대한 손실에 있어요. 이것은 퍼즐의 마지막 부분입니다.

답변

3

당신과 같이, 사용자 엔티티에 사용자 정의 상태 테이블에 매핑을 추가 할 수

/** 
    * @ORM\OneToOne(targetEntity="AccountStatus") 
    * @ORM\JoinColumn(name="status_id", referencedColumnName="id", nullable=true) 
    */ 
    private $accountStatus; 

이 또한 사용자 정의 상태 테이블을 설명하는 개체를 만들 필요합니다. 그런 다음 연결된 사용자 가이드에서 참조한대로 Symfony\Component\Security\Core\User\AdvancedUserInterface을 구현하여 사용자 엔티티에서이 매핑을 사용할 수 있습니다. 그리고 ...이 같은 isEnabled 기능 무언가를 구현

public function isEnabled() 
{ 
    return $this->getAccountStatus()->getIsActive(); /* Or whatever you named it */ 
} 

편집 :을 바탕으로

AdvancedUserInterface에 대한 API Doc, 당신은 당신이하는 데 필요한 다양한 상태를 처리하기위한 사용자 지정 논리를 수행하려는 경우 예외 리스너 등록 ...

이러한 상황에 대해 사용자 지정 논리를 수행해야하는 경우 예외를 등록해야합니다 각 경우에 발생하는 특정 예외 인스턴스가 인지 확인하십시오. 모든 예외는이 here 같은 것을 만들기위한 꽤 좋은 요리 책 기사가있다 AccountStatusException

의 서브 클래스입니다. 이 인스턴스의 기본 프로세스는 리스너를위한 클래스를 만드는 것입니다 ...

SRC/한국 전기/DemoBundle /의 EventListener/AcmeExceptionListener.php 위

namespace Acme\DemoBundle\EventListener; 

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Security\Core\Exception\DisabledException; 
use Symfony\Component\Security\Core\Exception\LockedException; 

class AcmeExceptionListener 
{ 
    public function onKernelException(GetResponseForExceptionEvent $event) 
    { 
     $exception = $event->getException(); 

     if ($exception instanceof DisabledException) { 
      // Customize your response object to display the exception details 
      $response = new Response(); 
      $response->setContent('<html><body><h1>Custom disabled page!</h1></body></html>'); 

      // Send the modified response object to the event 
      $event->setResponse($response); 
     } 
     elseif ($exception instanceof LockedException) { 
      // Or render a custom template as a subrequest instead... 
      $kernel = $event->getKernel(); 
      $response = $kernel->forward('AcmeDemoBundle:AccountStatus:locked', array(
       'exception' => $exception, 
      )); 

      $event->setResponse($response); 
     } 
     // ... and so on 
    } 
} 

그냥 기본적인 예입니다 만, 어쨌든 당신에게 요점을 제공합니다. 기술적으로 나는 AccountStatusException을 확장하여 사용자 정의 예외를 만든 다음 AdvancedUserInterface 구현을 위해 로직에 던져 넣을 수 있다고 생각합니다. 그러면 어떤 상황에 있는지 정확히 알 수 있습니다. 어쨌든, 리스너를 서비스로 등록하십시오. 이것에 대해 갈

응용 프로그램/설정/config.yml

services: 
    kernel.listener.your_listener_name: 
     class: Acme\DemoBundle\EventListener\AcmeExceptionListener 
     tags: 
      - { name: kernel.event_listener, event: kernel.exception, method: onKernelException } 

또 다른 방법은 사용자 정의 사용자 검사기의 일종을 구현하는 것입니다. 이 질문을보십시오 : Symfony2 custom user checker based on accepted eula

+0

나는 이것이 내 상태 테이블에서 내가 원하는 상태라고 생각합니다. 그러나 활성 상태, 확인되지 않은 상태, 금지 상태 등의 상태가 있습니다. 사용자 로그인을 거부하고 다른 페이지 기반으로 리디렉션하고 싶습니다. 상태에. 사용자가 등록 후 해당 메시지가있는 페이지와 등록 이메일을 다시 보내기위한 버튼을 확인하지 않은 경우의 예입니다. 금지 된 사용자는 금지 된 메시지 등을 얻을 것입니다. –

+0

BTW 나는 alredy가 수행 한 매핑을 가지고 있습니다. 아직 isEnabled 함수가 완료되지 않았습니다. –

+0

계정 상태에 따라 사용자 지정 작업을 수행하는 데 도움이되는 몇 가지 추가 예제와 정보를 추가했습니다. – ChadSikorra

관련 문제