springcloud 搭建 分布式系统,在搭建权限系统时,选择用jwt作为无状态,前后端分离做保证。
实现方案:
1.通过shiro spring-security都能很好的实现restfull风格的后端接口Api;
2.通过集成jwt,可以很好的生成token,并用于鉴权或认证判断;
3.jwt其实就是存储了一些信息,通过后端解析,来判断是否登录,是否有权限访问,通过全局处理可以很好的解决问题;
那么问题来了:
如果jwt只存储【用户信息】,通过后端解析,查询该用户的角色+权限信息,可以判断认证和鉴权,这样token也就比较短,存储【用户信息+角色信息】,通过后端解析,获取用户权限信息,token相对比较长;如果存储【用户信息+角色信息+权限信息】,token可能会特别长,对于大型api应用,超过4k也很可能。有没有更好的解决方案。
只存储【用户信息或加角色信息】,token 是相对短的,角色增长速度一般不会线性,未来业务也不会太过膨胀,当时对于分布式应用,要么到微服务后端会不断通过RPC访问权限系统获取 鉴权及登录认证,哪怕做到网关层面也是一样的。这是弊端。当然,可以通过中间件redis分布式缓存的方式,缓存角色信息或权限信息,让微服务的访问鉴权认证都去redis中拿,但依赖中间件还是不太美好。
如果存储【用户+角色+权限】信息,弊端是随api的增长信息不断膨胀,导致api访问传输压力。好处也有就是不管访问哪个微服务api都不会对权限系统的造成压力,因为压根不需要不断的去访问权限系统,因为信息够用,自我解析就能满足。当然坏处也是显而易见的。
有没有特别完美的方案呢?