我正试图找到一个简单问题的最佳解决方案,这个问题并没有在很大程度上讨论过.
我的应用程序有很多用户可以创建和编辑数据.用户应该只能看到和编辑他的数据,而不是其他数据.
想想有餐厅A和菜单菜单A的爱丽丝,以及有餐厅B和菜单菜单B的鲍勃.
我有CRUD餐馆和菜单的API,我可以很容易地只授权具有正确声明和角色的登录用户.我现在要做的是阻止Bob访问Alice的餐厅或菜单,反之亦然.例如,Bob应该被授权PUT /api/restaurants/B但应该是未经授权的PUT /api/restaurants/A甚至是PUT /api/restaurants/A/menus/x
一个可能的解决方案是这里提供的ASP.NET MVC属性,只允许用户编辑他/她自己的内容.此解决方案需要创建自定义Authorize属性以主动检查记录的用户是否是所访问实体的专有权.实体具有userId字段以检查发出请求的用户是否是数据的所有者.这个解决方案很干净,但缺乏一些功能.模型中的每个实体都应该有一个userId字段,并且只能由所有者访问或者我需要导航到授权模型的根实体的每个实体(例如,访问菜单我需要查询父实体Restaurant来检查如果MenuB在用户拥有的餐馆内).要实现多个所有者(例如餐馆经理),逻辑将会复杂得多.我也担心这里的开销,因为基本上每个调用都需要做一些查询来检查数据访问,但这可能不是问题.
有最好的做法吗?