2011-10-13 6 views
6

사용자가 보호 된 URL에 액세스하려고 시도하고 이 아니고이 인증/승인 된 경우 일부 코드를 실행해야하는 상황이 있습니다.URL/경로가 프로그래밍 방식으로 방화벽 뒤에 보호되는지 확인할 수 있습니까?

기본적으로 Symfony는 사용자를 로그인 양식으로 리디렉션하거나 전달하여 인증되지 않은 사용자를 처리합니다. 요청 메소드가 POST이고 대신 JSON 객체를 반향 시키면이 문제가 발생하지 않도록하고 싶습니다.

  • 체크하면 POST를 요청 메소드 인 경우

    • 검사 :이 처리하는 생각할 수

      가장 좋은 방법은 kernel.request 이벤트를 수신하고 두 가지를 확인하는 사용자 정의 리스너를 만드는 것입니다 사용자가 완전히 인 경우

    POST 요청이고 사용자가 완전히 인증되지 않은 경우 JSON 개체를 반향시킵니다.

    하지만 내 수신기는 모든 요청에 ​​대해 (예상대로) 발사합니다. 요청이 방화벽으로 보호 된 URL에 대한 것인지 확인하는 것으로 제한하고 싶습니다. 이것을 프로그램으로 점검 할 수 있습니까?

    나는 또한 이것에 대해 갈 수있는 간단한 방법이 잔소리 의심을 가지고 있지만, 사람이 어떤 조언이 있다면, 내가 그들 :)

    편집을 듣고 싶어요, 그래서 그것을 알아낼 수 없습니다
    @Problematic - 방화벽이있는 요청 만 확인하는 이유는 방화벽이 적용되지 않은 요청이 있고 코드가 실행되면 요청의 실제 응답 대신 앞서 언급 한 JSON 개체가 수신되기 때문입니다.

    지금 로그인하지 않고 api/get/something (방화벽 뒤에있는)에 POST 요청을하면 symfony는 로그인 페이지를 설명하는 HTML을 반환합니다. 대신, 나는 단지 {error: 'User is not authorized'}과 같은 것을 반향시키고 싶습니다. 하지만 POST 요청에 대해서만이 작업을 수행하기를 원합니다.

  • +0

    방화벽 요청을 확인하는 이유는 무엇입니까? – Problematic

    +0

    @Problematic, 내 편집을 참조하십시오 –

    답변

    3

    나는 이것이 잘못된 길로 가고 있다고 생각합니다. URL 뒤에 방화벽이 있는지 알고 싶었지만 현재 사용자에게 요청한 권한이 있는지 알아봐야했습니다. 본질적으로 사용자가 URL에 대한 액세스가 거부되었다는 것을 알면 URL이 방화벽 뒤에 있어야한다는 것을 의미합니다. 그렇지 않으면 액세스가 거부되지 않았습니다.

    이 점을 염두에두고 내가 원하는 최종 결과를 얻을 수있었습니다. 당신은 보안 메커니즘의 작동 방식을 실현하면 그것은

    • Symfony\Component\Security\Http\Firewall

      kernel.request 이벤트를 수신 ... 아주 간단 방화벽이 다음 보안 위반하면 security.yml
    • 에 등록 된 이벤트 리스너의 번호로 전화를
    • (즉, 로그인하지 않고 무언가에 액세스하려는 사용자)가 감지되면 AccessDeniedException이 발생하고 kernel.exception 이벤트가 전달됩니다.
    • Symfony/Component/Security/Http/Firewall/ExceptionListener은 이벤트를 수신하고 다음 단계가 무엇인지 결정하는 onKernelException 메서드를 실행합니다.인증 프로세스를 시작하는 것은 내가 피하기 위해 원하는 것을 때문에 내 경우에는, 그것은 인증 과정

    을 시작 것, 내가 심포니의 ExceptionListener보다 먼저 kernel.exception을 차단 내 자신의 이벤트 리스너를 썼다. 만큼 사용자가 허가되지 않는

    public function handleException(GetResponseForExceptionEvent $event) { 
         $exception = $event->getException(); 
         $request = $event->getRequest(); 
         if ($request->getMethod() == 'POST') { 
          if ($exception instanceof AccessDeniedException) { 
           $response = new Response({err: 'not logged in'}); 
           $event->setResponse($response); 
          } 
         } 
        } 
    

    및 요청 방법은 POST이다, JSON 개체가 반환됩니다 나는 이것은 내가 쓴 방법 1.

    의 우선 순위 내 이벤트 리스너를 준 (이는 또한 이벤트 전파를 중지합니다) 로그인 페이지의 HTML 대신. 그렇지 않으면 kernel.exception의 다른 리스너가 반응하고 Symfony는 사업에 착수 할 수 있습니다.

    그래서 원래의 질문에 답을 얻지는 못했지만 사용자가 작업에 액세스 할 수 있는지 확인하여 수행 할 수 있다고 생각합니다. Symfony\Component\Security\Core\Authorization\AccessDecisionManager 그게 도움이 될 것 같습니다.

    편집이 방법 내가 아직 테스트하지 않았습니다. 로그인하지 않은 사용자를 처리하는 경우
    는 나도 몰라,하지만 난이 (로그인) 경우도 발생합니다 생각 사용자는 부여되지 않은 역할이 필요한 작업에 액세스하려고 시도합니다. 이로 인해 문제가 발생하는 경우, 로그인하지 않은 사용자만을 고려하여 Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolverisFullFledged($token) 메서드를 사용하도록 수정하려고 시도합니다.

    +0

    json 응답을 보내는 경우 다음을 사용하여 ajax 요청인지 확인해야합니다. $ request-> isXmlHttpRequest(). 이것은 기본 인증 메소드를 ajax 메소드로 바꾸기 위해 사용했던 것입니다. – HappyDeveloper

    +0

    @HappyDeveloper 팁을 주셔서 감사합니다. 그러나 저는 여전히 일반 폼 로그인을 사용하고 있습니다. POST 요청이 보호 된 작업에 만들어지고 사용자가 로그인하지 않은 경우 다르게 대응해야했습니다. –

    관련 문제