You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
这个时候我们就把角色(role)做了硬编码,假设我们还有一个更新产品的功能,我也一样会判断角色是否是admin,但问题是用户可能需要自己管理角色,或者说他说管理员A负责用户管理,管理员B负责产品管理,这个时候你就懵b了吧,所以我们新建一层抽象,这个时候才引出了scope,我们基于scope做授权管理,而role和scope关系开放给用户去设定。想明白底层逻辑,这个时候你去看RBAC(Role based Access Control)就会比较好的理解。
比如你去酒店开房,你需要拿身份证办理Check in,这是一个认证过程,身份证和密码的功效是一样的证明了你是谁,前台给你的房卡表示授权你开302房间,你不能用身份证去开别人房间吧,这就是认证和授权的区别。
整个授权过程有2个重要的概念:
从零开始
我们写了两个api, 分别都需要认证,
这里mock了一个auth的middleware,完成用户foo的认证,
这个时候我们来了一个需求,普通用户可以查看所有用户,但只有管理员可以修改用户,给user加上role [user | admin], 然后在api中判断一下就搞定了,
这个时候我们就把角色(role)做了硬编码,假设我们还有一个更新产品的功能,我也一样会判断角色是否是admin,但问题是用户可能需要自己管理角色,或者说他说管理员A负责用户管理,管理员B负责产品管理,这个时候你就懵b了吧,所以我们新建一层抽象,这个时候才引出了scope,我们基于scope做授权管理,而role和scope关系开放给用户去设定。想明白底层逻辑,这个时候你去看RBAC(Role based Access Control)就会比较好的理解。
ok, 我们来实现一下,首先建立user, role和scope关系,
然后在auth中根据user的roles得到对应的scopes合集,
最后就是应用,
测试一下,
接着来考虑一个问题,普通用户随便不能随便改其用户信息,但他应该可以改自己的用户信息吧,那么普通用户是否需要user:write的scope呢?
这里假设修改本人信息的api为
PATCH /user
或者PATCH /users/me
,那么在这个route需要scope吗?实际情况是,每个验证过身份的用户都可以修改自己的用户信息,所以就根本不需要scope,重构
我们通过auth这个middleware同时整合Authentication和Authorization两个过程。
改造后的调用更加简洁,
对应的auth
补充话题: Decorator?
先来认识一下babel 6中的decorator, 也可以看阮一峰写的文章,
运行这段代码,需要做点配置,
yarn add babel-cli babel-plugin-transform-decorators-legacy -D
.babelrc
run
➜ npx babel decorator.js | node -
有了decorator的基础就可以了解一下gwuhaolin/koa-router-decorator: @route decorator for koa-router
好不容易摆脱了Spring,没想到吧。
The text was updated successfully, but these errors were encountered: