前后端分离 权限控制

前后端分离模式下的权限设计方案  https://mp.weixin.qq.com/s/OGyMUWXB3DuvNv-MGsbKiA

来源:www.cnblogs.com/liuyh/p/8027833.html

前后端分离模式下,所有的交互场景都变成了数据,传统业务系统中的权限控制方案在前端已经不再适用,因此引发了我对权限的重新思考与设计。

权限控制到底控制的是什么?

在理解权限控制之前,需要明白两个概念:资源和权限。什么是资源,对于一个系统来说,系统内部的所有信息都可以理解为这个系统的资源。页面是资源、数据是资源、按钮是资源、图片是资源、甚至页面上一条分割线也可理解为是这个系统的资源。

而权限就是访问某个资源所需要的标识。无论系统的权限如何设计,在用户登录时,都可以计算得出用户所拥有的权限标识集合,也就确定了该用户能访问哪些系统资源,这就是我理解的权限控制的本质。于是我们可以得出:权限控制是控制登录用户对于系统资源的访问。

前后端分离模式下,前后端在权限控制中各自的职责是什么?

在弄清前后端在权限控制中各自的职责是什么之前,需要理解前后端各自在系统中的职责。这个还是很好理解:

服务端:提供数据接口。

前端:路由控制、页面渲染。

由于前端负责与用户交互,用户所能操作的资源入口都是由前端进行控制,那么前端的权限控制就包括:

前端路由的权限控制,过滤非法请求,用户只能访问权限范围内的页面资源。

页面内组件的权限控制,根据用户的权限控制页面组件的渲染。包括各种按钮、表格、分割线等。

随着前端组件化的快速发展,用户所看到的一切均可理解为组件,页面是个大组件,其内部由各个小组件拼凑而来,那么前端权限控制最终落地到对组件的权限控制。于是脑补了出了最优雅的权限组件使用方式:

<组件permissionName='xxx'/>

前端可以渲染出用户权限范围内的各种系统资源,但是不能保证数据接口的安全性,某些比较喜欢折腾的用户完全可以越过前端的页面访问我们系统的数据接口,那么服务端的权限控制最终落地到对接口的权限验证。

实现思路

引上文,系统的一切资源均可进行权限控制,实际上也可以做到,但在我们实际的操作过程中,往往不需要细化到分割线那种程度。这里以按钮级权限控制为例做实现说明,如果有更细粒度的权限需求,此思路依然可行。

前端路由权限控制。用户登录时拿到用户拥有的权限标识集合,在前端存储。路由变化时,进行权限判断,通过则渲染对应页面组件,否则渲染403组件。示例代码:

let hasPermission = permission.check(current.permissionName);

{hasPermission ? children :}

封装bird-button权限按钮组件,传入按钮所需权限名,内部进行权限判断,通过则渲染按钮。

测试按钮

服务端。服务端权限验证很好理解。使用拦截器验证当前请求的权限。代码示例:

publicclassSsoAuthorizeInterceptorextendsHandlerInterceptorAdapter{

@Autowired

privateTicketHandler ticketHandler;

@Autowired

privateSsoAuthorizeManager authorizeManager;

@Override

publicbooleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throwsException{

if(!(handlerinstanceofHandlerMethod))returnfalse;

HandlerMethod handlerMethod = (HandlerMethod) handler;

SsoAuthorize authorize = handlerMethod.getMethodAnnotation(SsoAuthorize.class);

if(authorize !=null) {

TicketInfo ticketInfo = ticketHandler.getTicket(request);

if(ticketInfo ==null) {

thrownewUnAuthorizedException("用户信息已失效.");

}

String[] requirePermissions = authorize.permissions();

if(requirePermissions.length==0)returntrue;

booleanisCheckAll = authorize.isCheckAll();

UserPermissionChecker permissionChecker = authorizeManager.getUserPermissionChecker();

if(!permissionChecker.hasPermissions(ticketInfo.getUserId(),requirePermissions,isCheckAll)){

thrownewForbiddenException("用户没有当前操作的权限.");

}

}

returntrue;

}

}

源码地址

本博客涉及到的前端权限控制思路均已在:

https://github.com/liuxx001/bird-front

项目中实现,项目中除了按钮级权限方案还提供了后台业务系统开发中常用的数据组件,包括:

下拉选择器:bird-selector。

https://github.com/liuxx001/bird-front/blob/master/doc/bird-selector.md

全自动数据表格:bird-grid。

https://github.com/liuxx001/bird-front/blob/master/doc/bird-grid.md

全自动树表:bird-tree-grid。

https://github.com/liuxx001/bird-front/blob/master/doc/bird-tree-grid.md

数据树:bird-tree。

https://github.com/liuxx001/bird-front/blob/master/doc/bird-tree.md

全自动表单:bird-form。

https://github.com/liuxx001/bird-front/blob/master/doc/bird-form.md

权限按钮:bird-button。

https://github.com/liuxx001/bird-front/blob/master/doc/bird-button.md

所有业务组件的理念均是结合服务端接口进行组件的封装,兼顾灵活性的同时保证更优的业务开发速度。

欢迎指正,提出不同的看法。

(完)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容