为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
一只名叫tom的猫 2021-07-05 16:36:33
我有一个 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.
查看完整描述

3 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

要使其正常工作,请将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和supports


public function start(Request $request, AuthenticationException $authException = null)

{

    return new Response('', Response::HTTP_UNAUTHORIZED);

}


public function supports(Request $request)

{

    return false;

}

注意:以上实现在 Symfony 4 (4.3) 上测试过


查看完整回答
反对 回复 2021-07-09
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

这就是我的安全性的样子。它以您想要的方式工作,只是我使用 OAuth


firewalls:

    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


查看完整回答
反对 回复 2021-07-09
  • 3 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信