【问题标题】:Symfony2 cross domain authentication from AngularJS form return AnonymousToken来自 AngularJS 表单的 Symfony2 跨域身份验证返回 AnonymousToken
【发布时间】:2023-03-26 15:22:01
【问题描述】:

我有两个独立的项目:一个 Symfony 项目,它为经过身份验证的用户返回一些 json 和一个 AngularJS 项目,它提供用于检索数据的 UI。 现在,我为防火墙配置而苦苦挣扎,以允许我的 UI 进行正确的身份验证。

这是我的security.yml

security:
    encoders:
        AppBundle\Entity\User:
            algorithm: sha512
            encode_as_base64: false
            iterations: 10

    providers:
        api_key_user_provider:
            id: app_bundle.api_key_user_provider

        entity_user_provider:
            entity:
                class: AppBundle\Entity\User
                property: email

    firewalls:
        main:
            pattern: ^/(?!login).+
            stateless: false
            simple_preauth:
                authenticator: app_bundle.api_key_authenticator
            provider: api_key_user_provider
            anonymous: ~
            logout: ~
            context: dashboard

        login:
            pattern: ^/login
            provider: entity_user_provider
            form_login:
                login_path: /login
                check_path: /login/check
                csrf_provider: security.csrf.token_manager
            anonymous: ~
            context: dashboard

    access_control:
         - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
         - { path: ^/, roles: IS_AUTHENTICATED_FULLY }

所以,当我尝试将凭据从 UI 发布到 /login/check 时,我会得到下一个结果:

AnonymousToken(user="anon.", authenticated=true, roles="")

看来,我的请求正在由AnonymousAuthenticationProvider而不是Entity_user_provider处理。

那么,我的问题:我的 security.yml 配置有什么问题,以及如何正确地使用我的客户端表单进行跨域身份验证?结果我需要返回 api-key。我想,我可以在我的 Security:login 中做到这一点,不是吗?

(为了启用 CORS,我使用的是 NelmioCorsBundle)。

另外,也许这会有所帮助。这是我在 config.yml 中的 CORS 设置:

nelmio_cors:
    defaults:
        allow_credentials: false
        allow_origin: []
        allow_headers: []
        allow_methods: []
        expose_headers: []
        max_age: 0
        hosts: []
        origin_regex: false

paths:
    '^/' :
        allow_credentials: true
        origin_regex: true
        allow_origin: ['http://my_local_domain_with_angular']
        allow_headers: ['*']
        expose_headers: ['*']
        allow_methods: ['POST', 'GET', 'DELETE', 'PUT', 'HEAD']
        max_age: 3600

如果您需要更多详细信息,请告诉我!

感谢您的帮助!

【问题讨论】:

    标签: angularjs symfony security


    【解决方案1】:

    我已经解决了。

    首先,我注意到form_login 监听器没有处理来自外部表单的数据。所以我改用simple_preauth 监听器。我已经定义了两个独立的防火墙:

    firewalls:
    
        main:
            pattern: ^/(?!login).+
            stateless: false
            simple_preauth:
                authenticator: app_bundle.api_key_authenticator
            provider: api_key_user_provider
            anonymous: ~
            logout: ~
    
        login:
            pattern: ^/login
            stateless: false
            simple_preauth:
                authenticator: app_bundle.email_password_authenticator
            provider: email_user_provider
            anonymous: ~
    

    如果登录成功,接下来我的服务会生成api_key,可用于在main 防火墙上进行身份验证。

    详情你也可以看my another question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多