gpt4 book ai didi

Symfony:为拒绝访问的安全选民提供消息?

转载 作者:行者123 更新时间:2023-12-04 02:19:59 24 4
gpt4 key购买 nike

我正在研究 API 的安全性。我检查每个请求的一些事情是:

  1. 用户的 IP 地址是否在访问白名单中
  2. 用户的账号是否过期
  3. 当天是否超出了用户的速率限制?

看来我应该使用一个安全投票器,也许每个这些东西一个,并在访问检查失败时返回 VoterInterface::ACCESS_DENIED

但是,我想在 API 响应中向用户提供一条消息,提供一些关于为什么他们的请求被拒绝的指示。我不能对安全选民这样做。

我目前的解决方法是监听内核 controller 事件,执行我的访问检查,然后在检查失败时抛出一个明确的 AccessDeniedException 和我的特定消息。

这是处理这个缺点的好方法吗?也许有一种方法可以在我忽略的安全选民中做到这一点?

最佳答案

我知道这是一篇旧帖子,但我遇到了同样的问题并且找到了一个非常有效的解决方案

PS: 我使用的是 symfony 3.4.4

想法是将 RequestStack 传递给投票者(构造函数注入(inject)),然后获取 session 并在 flashBag 中添加一条消息以在之后显示。

选民构造函数:

use Symfony\Component\HttpFoundation\RequestStack;

class ContactVoter extends Voter {

private $requestStack;

function __construct(RequestStack $requestStack) {
$this->requestStack= $requestStack;
}

如果您不使用 Autowiring 并希望将其作为参数传递到 service.yml 中,您可以使用 arguments: [@request_stack]

在选民内部,决定权限的函数:

if ( 'Your_Access_Denied_Condition') {
$this->requestStack->getCurrentRequest()->getSession()->getFlashBag()->add('danger', 'Your message !');
return false ;
}

显示消息的模板

{% if app.request.hasPreviousSession %}
{% for type, messages in app.session.flashbag.all() %}
{% for message in messages %}
<div class="alert alert-{{ type }}">
{{ message|trans({}, 'messages') }}
</div>
{% endfor %}
{% endfor %}
{% endif %}

如果您不想使用 flashBag,您可以使用相同的逻辑来抛出带有特定消息的自定义异常,用监听器捕获它并显示您想要的消息。

关于Symfony:为拒绝访问的安全选民提供消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31253832/

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