java - Spring RESTful API如何做到对象(资源)级别的权限控制

 再生Solo_868 发布于 2022-10-25 17:29

比如"/api/v1/orders/{orderID}/action/cancel",这是一个对订单进行取消的API地址,很明显能进行这个操作的必须是订单交易双方用户,即用户只能操作orderID是属于自己的订单

1.spring security还有shiro这些安全框架都是基于角色(role)来做控制,没有精确到对象级别,虽然他们也有对象级别的权限控制,但是十分复杂不优雅,请教大家是怎么做的
2.如果在spring中的service层来做可以吗?在业务逻辑处理之前service自己判断用户是否有权限,这样就要求每个service层的方法参数中都要有当前用户的ID
3.如果在controller层调用service之前再独立一层专门做权限校验的是否可行

综上:请教大家在开发RESTful API时权限这方面是怎么做的,谢谢

4 个回答
  • 你这个是应该写个 Validator, 一般是作为controller的注解, 因为 restfull 中 一个controller 是一个完整的业务, 可能会调用很多service, 而service也有可能触发其他的分布式的请求, 如: jms消息等, 其实和古老的后端jsp或者freemarker中的controller不太一样, 古老的controller 有参数验证, 格式化参数, 执行业务, 组装相应参数以及跳转到下一页面等功能, 而现在的restfull少了最后一个步骤, 所以应该加在controller中

    2022-10-26 23:36 回答
  • 自己包装一个intercepter, 按参数与role鉴权嘛.例如, 按照用户session, 取userId. 按orderId取order判断是不是一个user

    2022-10-26 23:37 回答
  • 不要权限,调用这API的时候直接判断该用户有没有传过来的orderID不久好了么....你也说了这个操作必须是订单交易双方用户,第三方又不可能有这个订单ID.

    2022-10-26 23:37 回答
  • 你这个是数据级权限,不是spring security, shiro这种通用authc,authz框架能够解决的。

    所以这个控制权还是在你自己这里,你可以写在controller里,也可以写在service里。不过建议写在service里,因为你这个属于业务逻辑的一部分。

    2022-10-26 23:37 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有