- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究 API 的安全性。我检查每个请求的一些事情是:
看来我应该使用一个安全投票器,也许每个这些东西一个,并在访问检查失败时返回 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/
我已经实现了一个投票系统来检查用户是否可以查看他没有订阅的帖子。我在 Controller 的一个 Action 中调用它。 $this->denyAccessUnlessGranted('view'
我正在尝试使用 Java Config 设置一个 Spring Security 3.2 项目,根本不使用 XML。我想要一个支持 RoleHierarchyVoter 和 AclEntryVoter
我有属于特定用户的帖子。我创建了一个投票器来检查用户是否拥有帖子,但我也希望管理员(即 ROLE_ADMIN 及以上)能够访问所有帖子。 我已按照 How to Use Voters to Check
我想在 API PLATFORM 中使用 symfony 选民。当我在 itempsOperations(GET、PUT、DELETE)上使用它时没有任何问题,但是当我在 collectionOper
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!