2013-06-10 3 views
0

symfony2에서 수동으로 보안 예제를 기반으로 로그인을 구현하려고하지만 잘못된 것이 있거나 오류나 메시지가 전혀 표시되지 않습니다./routing.yml수동 기반 symfony2 로그인

wn_home: 
    pattern: /secured 
    defaults: { _controller: WNHomeBundle:Home:index } 
wn_users_homepage: 
    pattern: /hello/{name} 
    defaults: { _controller: WNUsersBundle:Default:index } 
wn_users_register: 
    pattern: /register 
    defaults: { _controller: WNUsersBundle:Register:register } 
wn_users_login: 
    pattern: /login 
    defaults: { _controller: WNUsersBundle:Security:login } 
login_check: 
    pattern: /login_check 

이것은 security.yml입니다

jms_security_extra: 
    secure_all_services: false 
    expressions: true 

security: 
    encoders: 
     Symfony\Component\Security\Core\User\User: plaintext 
     WN\Bundle\UsersBundle\Entity\User: sha256 
    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

    providers: 
     users: 
      entity: { class: WNUsersBundle:User } 

    firewalls: 
     login: 
      pattern: ^/login 
      security: false 
     secured_area: 
      pattern: ^/secured 
      form_login: 
       check_path: /login_check 
       login_path: /login 
      logout: 
       path: /logout 
       target: /login 
      #anonymous: ~ 
      #http_basic: 
      # realm: "Secured Demo Area" 

    access_control: 
     #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 
     - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 

그리고이

이것은 번들/구성 :

<?php 

namespace WN\Bundle\UsersBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\Security\Core\SecurityContext; 
use WN\Bundle\UsersBundle\Entity\User; 
use WN\Bundle\UsersBundle\Entity\UsersRepository; 

class SecurityController extends Controller { 

    public function loginAction() { 

     $request = $this->getRequest(); 
     $session = $request->getSession(); 

     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); 
     } 
     return $this->render('WNUsersBundle:Security:login.html.twig', 
       array('last_username' => $session->get(SecurityContext::LAST_USERNAME), 
         'error' => $error 
         )); 
    } 

} 

?> 

업데이트 :이 컨트롤러 login.html.twig입니다.

{% extends '::base.html.twig' %} 
    {% block content %} 
    {% if error %} 
    <div>{{ error.message }}</div> 
    {% endif %} 
    <form action="{{ path('login_check') }}" method="post"> 

    <label for="Username">Username</label> 
    <input type="text" name="_username" id="username" value="{{ last_username }}"> 

    <label for="Password">Password</label> 
    <input type="password" name="_password" id="password"> 
    <br /> 

    <input type="submit" name="submit" value="Login"> 
    </form> 

{% endblock %} 

바로 지금 오류가 있습니다 : 경로 "/ login_check"에 대한 컨트롤러를 찾을 수 없습니다. 라우팅 구성에 일치하는 경로를 추가하는 것을 잊었을 수 있습니까?

이 문제를 해결하는 방법을 아는 사람이 있습니까?

+0

이것은 분명하지 않습니다. 당신은 무엇을하려고합니까, 당신은 무엇을 기대합니까? 당신이 얻는 것과 어떻게 다른가요? – cheesemacfly

+0

login.i를 테스트하려고하는데 username과 password를 넣는 로그인 폼이 있습니다. 예를 들어, 필드를 비워두면 뷰를 볼 수 있습니다. {% if error %}

{{ error.message }}
{ – paul

+0

$ request-> attributes-> has (SecurityContext :: AUTHENTICATION_ERROR) - false이고 $ session-> get (SecurityContext :: AUTHENTICATION_ERROR)이 null입니다. – paul

답변

0

로그인 컨트롤러에 정의 된 다른 두 개의 공용 함수가 있어야합니다. Symfony2 보안 컨트롤러 메커니즘이 작동하기 위해서는 아무것도 넣지 않아도됩니다.

/** 
* @Route("/login_check", name="login_check") 
*/ 
public function loginCheckAction() 
{ 
} 

/** 
* @Route("/logout", name="logout") 
*/ 
public function logoutAction() 
{ 
} 

희망이 도움이 될 것입니다.