认证(authorization)和授权(authentication)的区别
- 认证(authorization):验证A是A,即A用户输入用户名密码,验证是不是正确
- 授权(authentication):认证A是A后,判断A是不是有访问某个url或者某个数据的权限
认证有几种方式
- 微信认证
- 用户名密码
- 手机号+密码
- 手机号+验证码
认证流程
微信认证登录
微信登录的方式通过微信认证用户,本地不进行认证。微信认证完成后获取微信用户信息并保存到用户信息模块,信息包括union_id,open_id,昵称等。随后生成jwt token返回给客户端
SSO和用户存储管理系统分开两个模块,目的是保证SSO相对稳定独立,不和用户管理业务逻辑耦合。用户管理逻辑可能包括:用户查询,用户信息更新等
手机号登录
手机号+密码登录的方式认证用户合法性
SSO认证
SSO是个登录门户,他通过调用微信服务或者用户系统认证用户信息合法性。如果合法,生成jwt token保存userid,有效期时间等信息给前端
网关统一认证
微服务体系下,对外接口有个约定:
- 对外暴露服务不能以user_id作为接口参数,必须以token进行传输。
如果微服务众多,每个服务都去验证token合法性会过于冗余。所以统一在网关层进行验证,流程如下:
- 对于每一个接口请求,网关会从http_header中获取token,并去sso验证token合法性。如果合法返回token对应的user_id。
- 网关将user_id放入http_header中传递到resource-service服务。
- resource-service通过http_header获取user_id并调用授权服务验证用户是否有权限访问该接口
如果对于网关不用每个接口都验证token,可以增加白名单,比如/public,/static路径可以不校验
授权管理
授权是认证后需要做的事情。一般授权管理的模型是基于role的模型,一般是用户属于某个role,role和权限关联。我们在这个基础上面做了扩充。
- 引入了组unit,部门deparment,用户可以属于某个unit,department,role,这些对象和权限permission关联。
- 权限permission关联一个或者多个资源,资源包括菜单,操作,视图等
- 权限permission关联一个或者多个动态管理函数funtion(使用js或者groovy写)
- 权限permission关联模块分类,分类关联平台