扩展DefaultAuthenticationSuccessHandler时,Symfony2保持行为

时间:2013-07-25 06:05:51

标签: authentication symfony

我希望能够通过常用的登录表单登录我的应用程序并使用AJAX直接将用户/密码发送到login_check路径。

这个想法是当用户通过AJAX访问时返回Response代码为200或400,具体取决于登录成功或失败。

查看其他线程我最终决定扩展默认处理程序DefaultAuthenticationSuccessHandlerDefaultAuthenticationFailureHandler以实现此目的,导出为服务并在我的安全区域中的success_handler属性中指定。

文件service.yml

服务:     authentication.success_handler:         class:%mycustom.authentication.success_handler.class%         参数:['@ security.http_utils',{}]         public:false         标签:              - {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' }

文件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

所有这些似乎都有效,除了我的extendend处理程序的行为与原始处理程序不同。在Symfony使用的默认实现中,如果您访问page/A但未登录,Symfony将重定向到登录页面,之后您将再次重定向到page/A。但这不会发生在我的扩展处理程序中。

要解决此问题,我可以在将处理程序注册为服务时指定default_target_path,但我想了解它为什么不遵循“正常”行为。

有任何想法。

提前致谢。

解决方案!!!

在查看和测试后,我在Symfony2 extending DefaultAuthenticationSuccessHandler

找到了解决方案

这个想法是覆盖默认的symfony成功/失败处理程序,而不是定义我自己的并在security.yml文件中应用。

文件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

文件service.yml。 (请注意服务名称中的 安全。

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' }

这样我们就可以使用自己的默认实现覆盖默认实现,而不需要在安全区域中指定处理程序。

0 个答案:

没有答案