1

I want to be able to login in my app via the usual login form and using AJAX directly sending the user/password to the login_check path.

The idea is when user access via AJAX return Response with code 200 or 400 depending if the login success or fails.

Looking at other threads I finally decide to extend the default handlers DefaultAuthenticationSuccessHandler and DefaultAuthenticationFailureHandler to achieve this, export as services and specify in the success_handler property in my secure area.

File service.yml

services: authentication.success_handler: class: %mycustom.authentication.success_handler.class% arguments: ['@security.http_utils', {} ] public: false tags: - { name: 'monolog.logger', channel: 'security' }

authentication.failure_handler:
    class: %mycustom.authentication.failure_handler.class%
    arguments: ['@http_kernel', '@security.http_utils', {}, '@logger' ]
    public: false
    tags:
        - { name: 'monolog.logger', channel: 'security' }

File security.yml

    secured_meems_area:
        pattern:    ^/somrurl/
        form_login:
            login_path: /somrurl/login
            check_path: /somrurl/api/login_check
            success_handler: authentication.success_handler
            failure_handler: authentication.failure_handler
            require_previous_session: false

All this seems to work, except the behaviour of my extendend handler isn't like the original one. In the default implementation used by Symfony if you access a page/A and you are not logged on, Symfony redirects to the login page and after it you are redirected again to page/A. But this not occurs with my extended handler.

To solve it, I can specify a default_target_path when registering the handler as a service, but I want to understand why it doesn't follow the "normal" behavior.

Any ideas out there.

Thanks in advance.

SOLUTION !!!

After looking and test I found a solution here Symfony2 extending DefaultAuthenticationSuccessHandler

The idea is override the default symfony success/failure handlers instead of define my own and apply in the security.yml file.

File security.yml

    secured_meems_area:
        pattern:    ^/somrurl/
        form_login:
            login_path: /somrurl/login
            check_path: /somrurl/api/login_check
            #
            # DON'T USE !!!
            #
            # success_handler: authentication.success_handler
            # failure_handler: authentication.failure_handler
            #
            require_previous_session: false

File service.yml. (NOTE the security. in the service name)

services:
    security.authentication.success_handler:
        class: %mycustom.authentication.success_handler.class%
        arguments: ['@security.http_utils', {} ]
        public: false
        tags:
            - { name: 'monolog.logger', channel: 'security' }

    security.authentication.failure_handler:
        class: %mycustom.authentication.failure_handler.class%
        arguments: ['@http_kernel', '@security.http_utils', {}, '@logger' ]
        public: false
        tags:
            - { name: 'monolog.logger', channel: 'security' }

This way we are overriden the default implementation with our own and don't need to specify the handlers in the security area.

Community
  • 1
  • 1
acanimal
  • 4,800
  • 3
  • 32
  • 41

0 Answers0