Manualne logowanie do Symfonii2 z secruity.context

0

Witam.

Od 2 tygodni marzę o tym, by wreszcie zamknąć temat logowania z symfoni. Otóż mój serwis jest oparty w całości na REST'cie. Czyli Ajaxem wysyłam żądania do serwera.

Tak więc tak samo chcę zrobić logowanie. Już myślałem że wszystko już mam za sobą... ale nie do końca. Moje logowanie w PHP wygląda tak:

        $token = new UsernamePasswordToken($user, $user->getPassword(), "main", $user->getRoles());
        $this->get("security.context")->setToken($token);
        $event = new InteractiveLoginEvent($request, $token);
        $this->get("event_dispatcher")->dispatch("security.interactive_login", $event);
        $this->get('event_dispatcher')->dispatch(AuthenticationEvents::AUTHENTICATION_SUCCESS, new AuthenticationEvent($token));

Działa w 50% , bo mam dostęp w kontrolerze do $this->getUser(), annotacje nawet działają

    @Sensio\Bundle\FrameworkExtraBundle\Configuration\Security("has_role('ROLE_USER')")

Tak więc jeśli nie jest zalogowany, to wyrzuca mi błąd AccessDanied - wszystko pozytywnie.

Lecz gdy chcę wywołać w kontrolerze

    $this->get('security.context')->isGranted('ROLE_USER')

To symfoni wyrzuca błąd:

	No Authentication Provider found for token of class "Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken".

Nie rozumiem, że w annotacjach wszystko ładnie działa, ale jak już chcę skorzystać z serwisu, to wywala mi ten błąd.

Ja nie chce żadnych "firewalli" w symfoni - chcę wszystko sam obsługiwać, poprzez annotacje przy kontrolerach, ewentualnie w kontrolerze.

Mój secruity config wygląda tak:

security:
    encoders:
        XXXX\Bundle\UserBundle\Entity\User:
            algorithm: bcrypt
            
    role_hierarchy:
        ROLE_ARTIST:    [ROLE_USER]
        ROLE_STUDIO:    [ROLE_USER]
        ROLE_ADMIN:     [ROLE_USER, ROLE_POST_MODERATOR]
        ROLE_SUPER_ADMIN: [ ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH, ROLE_POST_MODERATOR ] 

    providers:
        users:
            entity: { class: XXXUserBundle:User, property: username }


    firewalls:  
        dev:
            pattern: ^/(_(profiler|wdt|error)|css|images|js)/
            security: false

        default:
            anonymous: ~

Miał ktoś styczność z takim błędem? Czemu logowanie jest takie trudne w symfonii...

0

Odkryłem, że mam zarejestrowanego jednego prodvidera autoryzacji i jest nim AnonymousAuthenticationProvider , który nie przyjmuje tokena UsernamePasswordToken.

Nie wiem dlaczego, ale w systemie nie ma zarejestrowanego providera : "UserAuthenticationProvider" , wie ktoś jak go łatwo zarejstrować , jako providera, nie pisząc tego od nowa?

2

W ostateczności rozwiązałem problem poprzez napisanie własnego providera autoryzacji. Tutek do stworzenia takiego providera znajdziesz tutaj:
http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html

Nie zrobisz tego, nie używając standardowego formularza od symfony (gdzie w firewallu ustawiasz lokalizacje formularza itp ).

1 użytkowników online, w tym zalogowanych: 0, gości: 1