Symfony 4:不要重定向到 /login 来匹配路由

我有一个 Symfony 应用程序,它有两个主要部分。 /(根下的所有内容eg /userProfile)和/api/(/api路由下的所有内容eg /api/userInfo/3)。


我正在使用 Twig 在根目录下渲染实际页面,并JsonResponse在/api. 目前,当用户在未登录的情况下尝试访问任何页面/资源时,他们会被重定向到/login他们请求的页面/资源。


我想为/api. 我想做的/api/whatever是返回请求的资源(如果已登录),或者如果未登录则返回 401。我想继续重定向到/login所有其他路由。


(注意:/api路由本身并不是“RESTful”API 路由。它们是 UI 用来请求呈现各种页面所需的数据的“内部”API 路由。因此可以安全地假设用户会通过以下方式登录在他们的客户请求这些路由之一之前的正常登录表单。)


这是我的security.yaml:


security:

    providers:

        db_provider:

            id: database_user_provider

    encoders:

        App\Utility\Security\DatabaseUser: bcrypt

    access_decision_manager:

        strategy: unanimous

        allow_if_all_abstain: false

    firewalls:

        dev:

            pattern: ^/(_(profiler|wdt)|css|images|js)/

            security: false

        main:

            pattern: ^/

            context: main

            form_login:

                provider: db_provider

                login_path: login

                check_path: process_login

                default_target_path: manage

                use_referer: true

                failure_handler: App\Utility\Security\AuthenticationFailureHandler

            user_checker: App\Utility\Security\UserChecker

            anonymous: ~

            logout:

                path: logout

                target: login

            access_denied_handler: App\Utility\Security\AccessDeniedHandler  #Turn this off in dev.


    # Easy way to control access for large sections of your site

    # Note: Only the *first* access control that matches will be used

    access_control:

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

    - { path: ^/forgot, roles: IS_AUTHENTICATED_ANONYMOUSLY }

    - { path: ^/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }

    - { path: ^/%app.locales%, roles: IS_AUTHENTICATED_ANONYMOUSLY }

    - { path: ^/, roles: ROLE_USER }

如果我不包括login_path和 ,Symfony 会抱怨check_path。


那么,我如何告诉 Symfony 在用户未登录(或会话已过期)时简单地失败并返回 401,何时(且仅当)他们访问/api.


一只名叫tom的猫
浏览 172回答 3
3回答

繁星coding

要使其正常工作,请将api防火墙移至main.然后我们可以security.yaml使用以下结构对其进行设置:api:  pattern: ^/api  context: main  stateless: false  anonymous: true  guard:     authenticators:        - App\Security\ApiAuthenticator  provider: db_provider我们需要的另一件事是AuthenticatorInterface. 例如App\Security\ApiAuthenticator我们只需要实现从界面以下两种方法: start和supportspublic function start(Request $request, AuthenticationException $authException = null){    return new Response('', Response::HTTP_UNAUTHORIZED);}public function supports(Request $request){    return false;}注意:以上实现在 Symfony 4 (4.3) 上测试过

一只萌萌小番薯

这就是我的安全性的样子。它以您想要的方式工作,只是我使用 OAuthfirewalls:    dev:        pattern: ^/(_(profiler|wdt)|css|images|js)/        security: false    oauth_token:        pattern:    ^/oauth/v2/token        security:   false    oauth_authorize:        pattern:    ^/oauth/v2/auth        form_login:            provider: fos_userbundle            check_path: /oauth/v2/auth_login_check            login_path: /oauth/v2/auth_login            use_referer: true    api:        pattern:    ^/api        fos_oauth:  true        stateless:  true        anonymous:  false    main:        pattern: ^/        form_login:            provider: fos_userbundle            csrf_token_generator: security.csrf.token_manager        logout:       true        anonymous:    true        guard:            provider: fos_userbundle            authenticators:                - App\Security\GoogleAuthenticator                - App\Security\FacebookAuthenticator            entry_point: App\Security\LoginFormAuthenticator
打开App,查看更多内容
随时随地看视频慕课网APP