作者回复: 目前开源的资源权限设计方案很多,可以在github/gitee上搜一大把。不过我觉得大都不是很通用,所以我自己正在设计开发一个,类似auth0的用户管理和身份认证/鉴权服务,开发完成会开源出来。
作者回复: 外网token/内网jwt,这个是一种令牌实现方式,稍微有点复杂,中间涉及到令牌的存储和转化。本课程案例staffjoy,采用简单的jwt令牌,全程无状态,业务上安全性也足够。如果需要,在理解本课程案例代码的基础上,你不难扩展出外网token/内网jwt的方式,只不过需要存储token/jwt的映射关系,可存在DB或Cache中。
作者回复: 具体做法还是要看上下文,如果不同用户群在业务上是有关联的,可以通过角色区分,尽量建模成一个用户/授权中心,这时用户数据可以存ldap。如果不同用户群在业务上是不关联的,可以采用2个以上用户/授权中心(但也不能太多)分开管理,或者考虑采用支持多租户的用户/授权产品(比如fusionauth.io),这类产品支持一个用户/授权中心,但是可以多租户支持不同用户群分开管理。
作者回复: 上面讲Staffjoy安全认证架构设计中讲到SSO了,用户通过www服务登录,浏览器中就会种cookie,这个cookie种在根域上,例如,生产就是staffjoy.com,后面通过浏览器访问www.staffjoy.cpm或app.staffjoy.com或myaccount.staffjoy.com,只要是xxx.staffjoy.com都不需要再登录(除非jwt过期或者主动等出),会自动登录,因为cookie会自动带上,网关截获cookie,校验里头的jwt,通过就可以访问。
作者回复: 对,这种是无状态客户端存储令牌方式,比较简单。如果要严格保证一个用户只能有一个登录session,建议采用集中式令牌存储方式。
作者回复: jwt如果放在localstorage中有被xss攻击可能,恶意js可以操作localstorage里头令牌。staffjoy的jwt是放在cookie中,而且是http only,js脚本无法操作。但是cookie有csrf(跨站点请求伪造)风险,对于雇员排班这类应用可以接受,如果是其它安全严格网站,需要增加csrf防护,一般web框架都有支持(例如spring security)。
作者回复: resttemplate支持Interceptor机制动态添加http header的,可以参考:https://www.baeldung.com/spring-rest-template-interceptor
作者回复: spring(boot)提供支持集中式session的接口,可以对接redis等缓存,种cookie的动作spring(boot)框架内部已经实现。自己种cookie是为了灵活性,spring(boot)的security/session机制主要针对单块web应用,微服务+spa应用的场景比较复杂,自己处理安全和种cookie会更加灵活,实现也不复杂。
作者回复: 基于spring cloud oauth2也可以实现,它也支持生成jwt令牌,只要把它和用户DB数据对接起来,具体参考spring cloud oauth2的文档或者样例。
作者回复: 你好,app如果是hybrid的,也可以考虑放cookie或者local storage;如果是纯native app,那么android/ios都有自己专门的本地存储机制,然后可以通过http header传递令牌。