权限控制是一个古老的话题,你可能会想有没有什么权限设计方案可以满足所有的应用场景呢?
答案是没有,就像几乎所有问题一样,没有一种系统可以解决所有情况的,我们需要根据不同的场景和需求来设计不同的系统。
权限控制主要设计用户、角色、组、对象、操作、权限等对象。下面我先对这些对象做些解释,让大家先有个概念。然后我们再说说业界有哪些比较优秀的权限控制设计方案。
这个方案的实现就是权限控制,以单体服务为例:
1、首先我们需要用户管理系统,每个用户属于不同的单位,将这些用户与单位对应关系的数据加载到redis缓存,保证数据的访问速度。
2、用户在访问系统的时候,接口先去拿到用户的信息,然后去redis缓存中找自己对应的单位。
3、拿到单位信息后,去数据库中捞一下该单位的数据,这样就能保证了数据根据单位去隔离。
这种方案最核心的就是api要加用户权限的控制,那么每个数据也需要有用户权限的介入,这种方法用起来最为简单,不过还是建议在项目初期就要考虑全面,不然中间切入是非常麻烦的事情!
1.设置一个拦截器,根据拦截到的不同的单位,去走不同的逻辑,返回不同的数据 2.在数据上存储对应的单位,查询时就进行过滤。 3.构建鉴权系统,通过签名来进行权限控制
首先,安全起见,最好使用HTTPS通信,以防止中间人截获。其次,在HTTPS的前提下,对于API访问权限控制可以在,请求头里面添加一个字段传输Token(或者直接放在URL里面也行),该Token由服务器分配,服务器通过Token对用户权限进行权限控制。Token不合法,就不返回数据即可
1.通过接口用户的用户名密码,调用鉴权token接口获取接口用户的token,该token2个小时内有效; 2.把获取的token作为参数,调用接口的时候,会根据token去鉴权; 3.鉴权通过,接口会根据接口定义的编码,检验是否有访问权限 有则可以继续访问,无则提示访问受限。
当不合法的请求接口的时候不返回数据 加签名验证就行。提供密钥进行MD5。 首先,安全起见,最好使用HTTPS通信,以防止中间人截获。 其次,在HTTPS的前提下,对于API访问权限控制可以在,请求头里面添加一个字段传输Token(或者直接放在URL里面也行),该Token由服务器分配,服务器通过Token对用户权限进行权限控制。 Token不合法,就不返回数据即可。 如果你的合法是未授权调用 那直接用类似appkey就可以了 如果非法使用别人的授权 只能绑定ip域名 没看各种app的key都被别人拿来用了么 比如weico的 用公钥,MD5出来的加密串,再自己手动添加若干个字符串进去,看你怎么破?根本不算MD5,这个加密串,你一份,调用者一份,每次请求API的时候,构造方法里面先去验证这个token是否正确,如果不正确,说明别人在试探你的API,你直接发送404,告诉他找不到,故意去误导他,再来狠点,每个月去更换一次token,看你如何破?
某一角色用户只能看到所拥有菜单权限下的部分列字段数据
实现不同人看不同数据,不同人对同一个页面操作不同字段。系统按钮权限和表单权限原来是正控制,只有授权的人才有权限,未授权看不到对应按钮;
数据权限的配置 为解决这一类疑难问题,提供三种方式来实现数据权限。
1.提供代码层配置@DataAuth注解达到脱离数据库的全固定配置方式 ● 如果是纯注解配置,那么是不通过数据库的,相当于是离线配置。 ● 我们只需要关注column、type、value这三个字段。 ● column:需要过滤的数据库字段 ● type:数据权限过滤的类型 ● value:当数据权限类型为自定义的时候,配置的sql条件语句 1)、所在部门可见 配置DataAuth注解,因为默认字段就是create_dept,所以无需配置column 2)、所在机构及其子集可见 配置DataAuth注解,因为默认字段就是create_dept,所以无需配置column 3)、个人可见 配置DataAuth注解,由于创建人字段为create_user,不是默认,所以需要指定 4)、自定义配置 ● 配置DataAuth注解,配置自定义sql ● 在这个配置的sql里我使用里占位符${userId},没错,这么写在底层就可以直接获取到当前登录用户的deptId字段,除此之外我们还可以用更多的参数,比如${deptId}、${roleId}、${tenantId}、${account}、${userName}等等 ● 这些参数可以参考BladeUser类,他的所有字段我们都是可以根据占位符来获得的。
2.提供代码层配置@DataAuth注解配置数据权限资源编码来达到依赖数据库的半自动配置方式 这个就需要关联数据库,根据数据权限code码来设置数据权限定义规则。
3.Web可视化全自动动态配置 ● 数据权限动态配置需要依赖数据库,所以我们需要前往web端进行配置 ● 配置逻辑与纯注解配置一致,其实就是把注解配置拓展,并做成了web可视化
接口权限配置 1)、功能介绍 接口权限:顾名思义,配置不通角色调用接口的权限。有些敏感接口,是只能有固定的一些角色才能调用,普通角色是不能调用的。这种情况需要有一个明确的系统来控制对应的访问权限 接口权限系统,可以控制某些接口只能由固定的角色调用,可以动态控制不同的角色对不同接口的访问权限 通过接口配置实现,对接口的访问权限控制和数据权限控制,
接口是REST接口,接口权限认证机制使用Json web token (JWT)
接口权限调用流程: (1)通过接口用户的用户名密码,调用鉴权token接口获取接口用户的token 该token,2个小时内有效 (2)把获取的token作为参数,调用接口的时候,会根据token去鉴权 (3)鉴权通过,接口会根据接口定义的编码,检验是否有访问权限 有则可以继续访问,无则提示访问受限 (4)有访问权限,则获取接口的数据权限规则,根据授权的数据权限规则返回需要的数据 实现一个新的接口,无需关注token的鉴权机制,
接口权限判断方式 使用AOP实现接口拦截:@PreAuth
鉴权配置注解名称为 @PreAuth ,在需要进行鉴权配置的方法加上 @PreAuth 注解,并在注解内写 入相关的鉴权方法。
API项目通常来说就是接口项目,比如前后端分离的项目,前端页面+后端业务,数据通过API项目提供的接口获取,那么一般来说API项目是通过加密参数加密key来实现数据验证从而返回数据,而不是像通常后台管理系统一样通过登录系统来校验权限。
API想要实现不同单位获取不同的数据权限控制,大体上可以这么设计,API项目通过提供接口参数,比如单位id、数据范围(也就是想要获取的数据类型),前端项目给予API项目对应的参数,API项目通过参数作为条件返回对应数据权限内的数据,类似于实现不同单位不同权限的结果。
授予API阿里云RAM权限,该权限包括对不同单位数据的读取权限
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
DataWorks基于MaxCompute/Hologres/EMR/CDP等大数据引擎,为数据仓库/数据湖/湖仓一体等解决方案提供统一的全链路大数据开发治理平台。