【问题标题】:Access_Control refuses anonymous token'ed user to go throughAccess_Control 拒绝匿名令牌用户通过
【发布时间】:2016-07-05 20:56:42
【问题描述】:

我正在使用 Angular 中的前端应用程序和 Symfony2 中的 REST API 后端构建一个项目(2.7,需要很快迁移到 3.3)。 后端方面,我正在使用 FOSRestBundle、FOSUSerBundle、LexikAuthBundle 和一堆其他很酷的包来满足 REST API 的需求。 我最近通过社交服务提供商 Google 和 Facebook 实现了一次登录(前端登录按钮,然后创建 fos_user 后端并手动设置为刚刚识别的用户,LexikBundle 提供的 JWT)。这适用于以下app\config\security.yml

security:
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext
        FOS\UserBundle\Model\UserInterface: sha512

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_API:         ROLE_USER
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

providers:
    fos_userbundle:
        id: fos_user.user_provider.username

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false
    login:
        pattern:  ^/api/login
        stateless: true
        anonymous: true
        form_login:
            check_path:               /api/login_check
            login_path:               /api/login
            require_previous_session: false
            username_parameter:       username
            password_parameter:       password
            success_handler:          lexik_jwt_authentication.handler.authentication_success
            failure_handler:          lexik_jwt_authentication.handler.authentication_failure
    api:
        pattern:   ^/api
        stateless: true
        anonymous: true
        lexik_jwt:
            authorization_header:
                enabled: true
                prefix:  Bearer
            query_parameter:
                enabled: true
                name:    bearer

always_authenticate_before_granting:  true
    access_control:
        - { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/api/registration., roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/api, roles: [IS_AUTHENTICATED_FULLY, ROLE_API] }

这适用于 /api/login/social 路由(数据在正文中,POST),但无法到达 /api/registration :( :

    INFO - Matched route "myapp_security_register". 
        Context: {"route_parameters":     {"_controller":"myapp\\CoreBundle\\Controller\\SecurityController::registerAction","_route":"myapp_security_register"},"request_uri":"http://127.0.0.1:8000/api/registration"}
    INFO - Populated the TokenStorage with an anonymous Token.
    ERROR - Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException: "You do not have the necessary permissions" at C:\projects\myappAPI\vendor\friendsofsymfony\rest-bundle\FOS\RestBundle\EventListener\AccessDeniedListener.php line 70 
    Context: {"exception":"Object(Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException)"}

我不明白,因为设置了匿名令牌!为什么 access_control 不允许 /api/registration 访问我的控制器?我错过了什么? 如果有帮助,我也可以发布 FOSRestBundle 配置。

谢谢,博尔。

【问题讨论】:

    标签: php rest symfony access-control lexikjwtauthbundle


    【解决方案1】:

    您的access_control 指令中有一个错字

    - { path: ^/api/registration., roles: ['..'] }
    

    ...应该是

    - { path: ^/api/registration, roles: ['..'] }
    

    【讨论】:

    • 好的,谢谢!我有这个错字,我在发布后就看到并删除了它。但它也没有工作......我重新启动PC并重新启动集成php服务器,它现在似乎可以按预期工作。 security.yml 是否被缓存在开发环境中并且 clear:cache 会解决问题吗?
    • 是的,修复错字之后清除缓存的组合应该可以解决它:)
    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2015-09-19
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多