图片

图片


基于角色的访问控制,只验证访问数据的角色,但是没有对角色内的用户做细分。举个例子,用户甲与用户乙都具有用一个角色,但是如果只建立基于角色的访问控制,那么用户甲可以对用户乙的数据进行任意操作,从而发生了越权访问。因此,在业务场景中仅仅使用基于角色的访问控制是不够的,还需要引入基于数据的访问控制。如果将基于角色的访问控制视为一种垂直权限控制,那么,基于数据的访问控制就是一种水平权限控制。在业务场景中,往往对基于数据的访问控制不够重视,举个例子,评论功能是一个非常常见的功能,用户可以在客户端发起评论,回复评论,查看评论,删除评论等操作。一般情况下,只有本人才可以删除自己的评论,如果此时,业务层面没有建立数据的访问控制,那么用户甲可以试图绕过客户端,通过调用服务端RESTful API 接口,猜测评论 ID 并修改评论 ID 就可以删除别人的评论。事实上,这是非常严重的越权操作。除此之外,用户之间往往也存在一些私有的数据,而这些私有的数据在正常情况下,只有用户自己才能访问。

基于数据的访问控制,需要业务层面去处理,但是这个也是最为经常遗落的安全点,需要引起重视。这里,再次使用删除评论的案例,通过 Java 语言进行介绍。在这个案例中,核心的代码片段在于,判断当前用户是否是评论的创建者,如果是则通过,不是则报出没有权限的错误码。那么,这样就可以很好地防止数据的越权操作。

@RestController@RequestMapping(value = {"/v1/c/apps"})public class AppCommentController{    @Autowired    private AppCommentService appCommentService;@RequestMapping(value = "/{appId:\\d+}/comments/{commentId:\\d+}", method = RequestMethod.DELETE)public void deleteAppCommentInfo(@PathVariable Long appId,     @PathVariable Long commentId,        @AuthenticationPrincipal UserInfo userInfo) {        AppComment appComment = this.appCommentService.checkCommentInfo(commentId);// 判断当前用户是否是评论的创建者,如果是则通过,不是则报出没有权限的错误码。        if(!appComment.getUserId().equals(Long.valueOf(userInfo.getUserId()))){            throw new BusinessException(ErrorCode.ACCESS_DENIED);        }        this.appCommentService.delete(commentId);    }}

总结下,基于角色的访问控制是一种垂直权限控制,通过建立用户与角色的对应关系,使得不同角色之间具有高低之分。用户根据拥有的角色进行操作与资源访问。基于数据的访问控制是一种水平权限控制,它对角色内的用户做细分,确保用户的数据不能越权操作。基于数据的访问控制,需要业务层面去处理,但是这个也是最为经常遗落的安全点,需要引起重视。


更多相关文章

  1. 基于角色的访问控制
  2. 69.批量创建mysql用户
  3. 如何检测用户有关退出页面的信息?
  4. 如何在用户选择操作后获取当前日期和时间
  5. Symfony 2在用户站点上动态添加字段以形成
  6. Yii - 加载ajax表单元素的用户端验证
  7. EasyUI动态展示用户信息
  8. j2ee的web项目,有最终的html代码(即f12看到的最终给用户浏览器展示
  9. golang写服务端程序,作为文件上传与下载的服务器。配合HTML5以网

随机推荐

  1. go是开源语言吗?
  2. 解析Go中的多态 -无需interfaces
  3. go语言和Java语言的区别是什么?
  4. 用Go实现进制之间的转化
  5. 详解 Golang 通道 Chan
  6. go语言和python有什么区别?
  7. go-carbon1.2.4发布了!新增系列时间比较方
  8. 你知道go程序的基本要素吗
  9. Go语言有没有优势?
  10. 如何使用golang的pprof包对程序进行性能