本文转载自微信公众号「JAVA日知录」,作者的单 。请联系我们转载本文。JAVA微信官方账号日知录。
权限控制,或访问控制,广泛应用于各种系统。抽象地说,它是一个主体(subject)对某个客体(object)某种操作需要实施(operation),系统对此操作的限制是权限控制。
在网络中,为了保护网络资源的安全,一般基于路由设备或防火墙IP以及端口的访问控制。
在操作系统中,访问和控制文件。例如,在操作系统中Linux在系统中,可以执行文件的操作分为“读”、“写”、“执行”这三个操作对应于三个主题:文件所有者、文件所有者所在的用户组和其他用户、主题、对象和操作之间的相应关系,构成访问控制列表。
在Web在应用决以下目标问题,可以实现常见的访问控制:
- 他是谁?
- 他只能访问授予他权限的界面!
- 他无法查看别人的数据!
以前后端分离项目为例,解释如何解决这些目标问题:
他是谁?
前端用户登录后端服务将在前端和后端分离项目中发布token,比如我们所知道的JWT(JSON Web Token),然后每次前端请求后端接口都会带这个token。由于JWT会有用户信息,这个时候我们要做的就是验证这个token对应用户是否为系统合法用户。
他只能访问授予他权限的界面!
只知道他是系统的合法用户还是不够,web应用还得保证当前用户只能访问他拥有权限的接口。
例如,有一个工资查询接口,只允许部门领导在业务上访问。如果系统不控制,张三知道工资查询接口,着自己的token调用这个接口,然后你就可以知道所有员工的工资了。我们称之为这个问题"越权访问"。
目前广泛应用于处理这个问题的一种方法是“基于角色访问控制(RBAC:Role-Based Access Control)”,也称“垂直权限管理”。
RBAC不同的角色将在系统中提前定义。不同的角色有不同的权限。一个角色实际上是权限的集合。系统中的所有用户都将被分配到不同的角色中。用户可能有多个角色。
当用户带着token在要求后端服务时,我们必须通过token查询当前用户的角色,然后根据角色查询用户的所有权限。权限框架 Spring Security 和 Shiro都是很好的支持RBAC控制。
他无法查看别人的数据!
张三和李四都是部门领导,他们都可以查询员工工资的权限。但他们只被允许检查自己部门员工的工资。张三知道接口调用规则,可以通过修改调用参数获得李四部门员工的工资,当然不允许。
在RBAC在模型下,系统只验证用户A是否属于角色RoleX,而不是判断用户A访问是否只属于用户B的数据DataB,因此,越权访问发生了。我们称之为这个问题“水平权限管理问题”。
目前,数据级权限管理还没有一个非常普遍的解决方案,通常是具体问题。
简单的方法是添加密钥到接口请求,通过接口参数 当前系统登录器加密到后端服务,后端接收请求解密加密内容,根据约定的规则分析用户信息和匹配登录用户,匹配正常访问,不匹配拒绝访问。