背景
权限验证在我们系统中是一个与业务逻辑无关但是又与业务息息相关的一个功能。如何优雅的在项目中实现权限验证就是本文重点介绍的内容。
设想我们开发了一款为中小型企业定制的会员系统。这款系统可以为企业A、企业B等多种企业提供服务。数据库中的表结构往往是这样的(以下只是一个demo,实际情况中字段一定会更多、更复杂):
id | memberCardCode | userName | card_status | business |
---|---|---|---|---|
1 | a564456578 | zhangsan | 0 | business-a |
2 | b678688643 | lisi | 1 | businsss-b |
3 | a775445667 | wangwu | 0 | businsss-a |
4 | b943578978 | zhaoliu | 1 | businsss-b |
5 | c657688799 | sunqi | 1 | businsss-c |
基于上表,我们删除id = 1的会员往往是这样操作的(假设是物理删除):
controller层:
@RestController("/member")
public class MemberController {
@PostMapping("/delete")
public void deleteById(int id) {
// 此处省略删除代码
}
}
最终在controller中调用的SQL语句是这样的:
delete from member where id = 1;
乍一看,就这样一条简单sql语句能有什么问题呢?其实越是简单的问题,越不能放过。
通过上表我们看到id = 1的会员信息是属于business-a的。所以理应是business-a的账号才能删除id = 1的会员信息。那此时如果business-b在删除会员的时候将参数id改为1&