2015-05-12 7 views
1

Я попытался создать систему аутентификации в symfony2, но результатов не найдено. В строке состояния отладки для всех ситуаций у меня есть: Записан как anon.Вход в систему в symfony 2

Если я дамп сессии в представлении я получаю:

"_security.last_error" => BadCredentialsException 

Мой файл маршрутизации:

shop_show_login_page: 
    path: /login 
    defaults: { _controller: ShopDesktopBundle:User:loginPage } 

shop_login_user: 
    path: /loginUser 
    defaults: { _controller: ShopDesktopBundle:User:loginCheck } 

shop_logout_user: 
    path: /logout 

Мой контроллер:

class UserController extends Controller{ 
public function loginPageAction(){ 
    return $this->render('ShopDesktopBundle:User:loginPage.html.twig'); 
} 
public function loginCheckAction(){ 
    $request = $this->getRequest(); 
    $password = $request->request->get('_password'); 
    $login = $request->request->get('_username'); 
    $em = $this->getDoctrine()->getEntityManager(); 
    $repository = $em->getRepository('ShopDesktopBundle:Customer'); 
    $user = $repository->findOneBy(array('customer_login'=> $login, 'customer_password'=> $password)); 
    if($user){ 
     return $this->redirect($this->generateUrl('shop_desktop_homepage')); 
    }else{ 
     return $this->render('ShopDesktopBundle:User:loginPage.html.twig',array('message_failed' => 'Eroare : login sau password este gresit')); 
    } 
} 
} 

Мое мнение:

<form action="{{ path('shop_login_user') }}" method="post"> 
       <div class="form-group"> 
        <div class="input-group"> 
         <span class="input-group-addon"><i class="fa fa-user"></i></span> 
         <input type="text" class="form-control" placeholder="Username" name="_username"> 
        </div> 
       </div> 
       <div class="form-group"> 
        <div class="input-group"> 
         <span class="input-group-addon"><i class="fa fa-lock"></i></span> 
         <input type="text" class="form-control" placeholder="Password" name="_password"> 
        </div> 
       </div> 
       <div class="form-group"> 
        <button type="submit" class="button">Autentificare</button> 
       </div> 
      </form> 

security.yml:

security: 
# http://symfony.com/doc/current/book/security.html#encoding-the-user-s-password 
encoders: 
    Symfony\Component\Security\Core\User\User: plaintext 

# http://symfony.com/doc/current/book/security.html#hierarchical-roles 
role_hierarchy: 
    ROLE_ADMIN:  ROLE_USER 
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

# http://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers 
providers: 
    in_memory: 
     memory: 
      users: 
       user: { password: userpass, roles: [ 'ROLE_USER' ] } 
       admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] } 

# the main part of the security, where you can set up firewalls 
# for specific sections of your app 
firewalls: 
    # disables authentication for assets and the profiler, adapt it according to your needs 
    secured_area: 
     pattern: ^/ 
     form_login: 
      check_path: shop_login_user 
      login_path: shop_show_login_page 
      username_parameter: _username 
      password_parameter: _password 
     logout: 
      invalidate_session: true 
      path: shop_logout_user 
      target:/
     anonymous: true 
     #http_basic: 
     # realm: "Secured Demo Area" 

# with these settings you can restrict or allow access for different parts 
# of your application based on roles, ip, host or methods 
# http://symfony.com/doc/current/cookbook/security/access_control.html 
access_control: 
    #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 

Я провел несколько дней, но никаких результатов. Помоги мне, пожалуйста!!! Thx заранее

ответ

3

Я думаю, что проблема в том, что вы не обновили свой user providers В security.yml у вас еще есть статический список пользователей, предоставленных поставщиком in_memory пользователя. Система безопасности не знает вашего собственного класса ShopDesktopBundle:Customer.

Если следовать поваренная книга на «How to Create a custom User Provider», вы должны быть в состоянии решить ее:

Обновление вашего класса User

Ваш пользовательский класс Customer должен реализовать UserInterface (а также рекомендуется EquatableInterface)

class Customer implements UserInterface, EquatableInterface { […] } 

Добавить UserProvider

Вы должны создать UserProvider, как:

class CustomerUserProvider implements UserProviderInterface { 
    public function loadUserByUsername($username) { […]} 
    public function refreshUser(UserInterface $user) { […] } 
    public function supportsClass($class) { 
     return $class === 'Shop\DesktopBundle\Customer'; 
    } 
} 

Создание службы и обновления user_provider в security.yml

Наконец создать службу в вашем service.yml как :

services: 
    customer_user_provider: 
     class: Shop\DesktopBundle\CustomerUserProvider 

И обновить security.yml как:

security: 
    providers: 
     webservice: 
      id: customer_user_provider 
+0

Таким образом, это трудно для меня, чтобы понять, но ТНХ;) – TanGio

+0

@Gigel Попробуйте следовать «[Как создать пользовательский пользователь Provider] (HTTP: // symfony.com/doc/current/cookbook/security/custom_provider.html) "и принять его к вашей настройке, как это было в моем ответе. Если это усложняется, и, как кажется, вы пытаетесь построить магазин, где важны вопросы безопасности, вы можете подумать об использовании полностью функционального и поддерживаемого пакета, такого как [FOSUserBundle] (https://github.com/FriendsOfSymfony/FOSUserBundle). – insertusernamehere

+1

Thx, это работает;) – TanGio