gpt4 book ai didi

php - 交响乐 4 : Do not redirect to/login for matching routes

转载 作者:行者123 更新时间:2023-12-04 15:44:56 24 4
gpt4 key购买 nike

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

我正在使用 Twig 在根目录下呈现实际页面,以及一个简单的 JsonResponse渲染 /api 下的所有内容.当前,当用户在未登录的情况下尝试访问任何页面/资源时,他们将被重定向到 /login。然后转到他们请求的页面/资源。

我想为 /api 下的所有资源更改此行为.我想要什么/api/whatever要做的是返回请求的资源(如果已登录),或者如果未登录则返回 401。我想继续重定向到 /login对于所有其他路线。

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

这是我的 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 }

我已经尝试添加新的防火墙上下文 api :

api:
pattern: ^/api
context: main

# If I don't include this (from "main" firewall), I get an error stating no UserAuthenticationListener has been provided for secuirty.firewall.api.
form_login:
provider: db_provider
login_path: login
check_path: process_login
use_referer: true
failure_handler: App\Utility\Security\AuthenticationFailureHandler

如果我不包含 login_path,Symfony 会提示和 check_path .

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

谢谢。

最佳答案

要让它正常工作,请将 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

我们只需要从接口(interface)中实现以下两个方法:开始支持

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) 上测试

关于php - 交响乐 4 : Do not redirect to/login for matching routes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56282179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com