每周知识点介绍 - 权限验证流程 - 身份认证、授权、鉴权、权限验证
Hello, 大家好,我是小毛驴。欢迎大家来到每周知识点介绍栏目。本次我将带领大家一起来了解下权限系统的核心流程(概念)有哪些(见下述列表),我们在设计权限系统或者和权限系统连接时需要注意哪些。
- 身份认证
- 授权
- 鉴权
- 权限验证
通过本文的介绍,也期望能在大家未来的开发和设计上起到一些积极的作用。言归正传,我们开始进入正题吧。
让我们来设想一个场景,你是一个酒店的前台人员,有一位顾客昨晚在你们酒店预订了一间房,今天按时到达。你先验证这位顾客的身份,登记后给他发放一张房卡,顾客拿着这种房卡即可搭乘电梯和打开他自己的房门。
就在这个场景中,我们就经历了身份认证,授权,鉴权,权限验证的过程,具体的对应关系我们在下面展开。
身份认证是什么?
身份认证是一种确认某人是某人的安全实践,听着有些虚幻就好像。但在我们系统中一般就是验证你的密码和我们存储你的密码是否一致。当前身份认证还有其他的更安全的手段,我们这里先只讨论最简单的实现。
在我们上面酒店的例子中,我们要求顾客给我们验证码或者身份证,就是为了对顾客进行身份认证。
身份认证手段:手机短信验证,密码验证,动态口令验证,第三方验证(Oauth2)等等
授权是什么?
授权是指确定想每个用户手何种访问权限的过程,即在验证了你是我的用户之后,确定你在我这里有哪些权限。避免如果每次访问都进行用户认证时,加大了用户敏感信息泄露的可能。
在酒店的例子中,就是根据你预订的房间情况给你开通不同的权限,房间权限,电梯权限,早餐权限等。
然后将这种权限用令牌的形式发放给你,也就是将权限授予给了你。在酒店中就是将房卡和早餐券发放给你。
在我们的 Web 服务中,这个立牌就是登录完成后返回的 Cookie 中包含的 sessionId,Token,JWT-Token,Oauth2-Token 等
鉴权是什么?
鉴权在很多时候都会和权限验证混合在一起,我们尝试将他剥开分离来说明。鉴权和授权是匹配的,上一步的时候我们给用户下发的权限凭证,这一步我们要确认这个凭证是我们下发的,不是伪造的。
在酒店的例子中,我们在电梯中权限来做过不太像的比喻,电梯作为基础的鉴权者,对所有的凭证来进行鉴权,是酒店下发的凭证才能乘坐电梯,其他的全部拒绝。
注:虽然这里面已经涉及到权限认证了,但我们先模糊这个过程。另外那种电梯限制刷卡后只能到底自己楼层的例子也暂时不关注。
权限验证是什么?
权限验证就比较好理解了,我这个接口,这个操作需要什么权限,你的凭证代表的权限集里是否有这个权限,有就通过,没有就拒绝,这个过程就是权限验证。
在酒店中的例子就是,你的卡在刷你的房间时是可以刷开的,刷别人的房门是没有任何响应的。
在我们系统实现时,权限验证就和我们权限模型极其相关了。
小结
正如我们在图中见到的流程,整体权限的验证流程大概分为上述四部。
但在实际实现的过程中这四部会合并两步。身份认证和授权合并在一起,鉴权和权限认证合并一起,这样既方便了设计和编码,也方便了用户操作。合并的例子我们可以看看 Spring Security 的架构图。
将这张图中我们可以清晰的看到,Spring Security 将身份认证(LDAP、OpenID)和授权结合在一起,而将鉴权和权限验证结合在一起。形成了整个 Spring Security 的生态。