Open Vector6662 opened 3 years ago
创建四种Strategy类的单例,交由bean容器管理。提供两种方式指定创建strategy实例所需的JapUserService
对象:
JapUserService
的实现类上使用注解:@Service(JapServiceType.SOCIAL)
application.properties
中配置:jap.simple-user-service = com.fujieid.jap.spring.boot.starter.service.JapSimpleUserServiceImpl
,指定该service类的binary name。目前实现了两个特性:
JapStrategyFactory
提供的API中都不必开发者显式传递request
和response
参数。以socialStrategy
为例,展示三种主要的调用方式:
@Autowired
JapStrategyFactory japStrategyFactory;
@Autowired
JapProperties japProperties;
@Autowired
SocialStrategy socialStrategy;
方式一
japStrategyFactory.authenticate(Strategy.SOCIAL);
方式二,若采用的策略尚未指定JapUserService,可调用此方法。但不允许重复指定JapUserService实现。
japStrategyFactory.authenticate(Strategy.SOCIAL,socialUserService);
方式三
socialStrategy.authenticate(japProperties.getSocial(), request, response);
代码已经提交gitlab,请老师过目并提出宝贵意见!😁
完成五个starter的模块化开发,创建了jap-spring-boot-starter-demo
项目测试了部分strategy。目前的问题是当前模块化方式是否合理❓
以simple strategy为例,创建了jap-simple-spring-boot-starter
模块,里边只有一个@Configuration
注解的配置类:SimpleAutoConfiguration
,该类只负责向bean容器中注入一个bean对象:SimpleStrategy
。这样做的一个优点是,只有开发者引入了jap-simple-spring-boot-starter
模块的maven依赖,才能使用这个simple策略。
然而发现的问题是,这四个strategy的配置信息都在jap-spring-boot-starter
这个模块中,而每个像jap-simple-spring-boot-starter
这样的strategy自己的模块只负责创建自己的bean,个人的设想是每个strategy的模块中应该还要包含该类的配置信息,但随之而来的问题是,没有找到很好的方法集成到JapTemplate
中,但目前还在尝试。
你看能否抽取公共配置到一个 common( 模块名字看你喜好,也可以叫做config ) 模块下,然后其余模块依赖 common 模块,先研究能否抽取公共配置~
我看了下你的代码,其实你是把配置等信息放在 jap-spring-boot-starter
模块下的,这一块我觉得是否可以参考下官方的 spring-boot-starter-jpa
模块,看看他是怎么设计的?
@zhangyd-c 亚东也可以给点意见~
你看能否抽取公共配置到一个 common( 模块名字看你喜好,也可以叫做config ) 模块下,然后其余模块依赖 common 模块,先研究能否抽取公共配置~
我看了下你的代码,其实你是把配置等信息放在
jap-spring-boot-starter
模块下的,这一块我觉得是否可以参考下官方的spring-boot-starter-jpa
模块,看看他是怎么设计的?@zhangyd-c 亚东也可以给点意见~
好的,我去看看!
测试oauth策略的时候发现OauthStrategy.authnticate(...)
有这么几行:
即每次授权之前都会检查当前session中是否有用户,如果有的话则直接返回这个japUser。但是设想这样的场景:一个用户在同一个浏览器先后用Gitee和GitHub授权给我的应用,但在进行GitHub授权的时候session中已经有了前一次gitee授权的信息,这样是否会形成干扰?
@xkcoding @zhangyd-c 感谢两位老师!
对oauthStrategy测试了一下,发现用GitHub的Oauth得到的返回值是这样的:
access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&token_type=bearer
明显不是json格式,但要将其解析成json格式:
会报错。是否需要在请求的header上加上:Accept:application/json
呢?
问题 1:流程:新用户:登录-绑定-退出
问题 2:是的,现在是需要加上 Accept: application/json
才会返回 json 数据,这块我记得之前的是默认返回 json 的,可能 GitHub 做了调整
测试oauth策略的时候发现
OauthStrategy.authnticate(...)
有这么几行:即每次授权之前都会检查当前session中是否有用户,如果有的话则直接返回这个japUser。但是设想这样的场景:一个用户在同一个浏览器先后用Gitee和GitHub授权给我的应用,但在进行GitHub授权的时候session中已经有了前一次gitee授权的信息,这样是否会形成干扰?
@xkcoding @zhangyd-c 感谢两位老师!
我感觉你这个问题的逻辑可能存在问题,既然已经登录过了,为什么还要重复登录?正确的流程应该是:
测试oauth策略的时候发现
OauthStrategy.authnticate(...)
有这么几行: 即每次授权之前都会检查当前session中是否有用户,如果有的话则直接返回这个japUser。但是设想这样的场景:一个用户在同一个浏览器先后用Gitee和GitHub授权给我的应用,但在进行GitHub授权的时候session中已经有了前一次gitee授权的信息,这样是否会形成干扰? @xkcoding @zhangyd-c 感谢两位老师!我感觉你这个问题的逻辑可能存在问题,既然已经登录过了,为什么还要重复登录?正确的流程应该是:
- 使用 gitee 登录成功
- 退出 gitee 登录
- 使用 github 登录
明白了!确实应该是这样,我的逻辑有问题,谢谢东哥!
问题 1:我研究一下,在更新答案..
问题 2:是的,现在是需要加上
Accept: application/json
才会返回 json 数据,这块我记得之前的是默认返回 json 的,可能 GitHub 做了调整
问题1:谢谢沈老师!我也觉得东哥关于这个问题的回答有道理😄。 问题2:了解!是否需要修改一下jap源码呢?如果需要我可以试着提交一个PR。
沈老师我想问一个问题,我看到您写的justauth-spring-boot-starter中这个配置类是abstract的,这样做的目的是什么呢?
其实我这个是参考 org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration
实现的,当时我在设计 state 缓存的不同实现的时候,发现这个逻辑不就跟数据源选择的逻辑一致么,所以是受他启发的
沈老师我想问一个问题,我看到您写的justauth-spring-boot-starter中这个配置类是abstract的,这样做的目的是什么呢?
其实我这个是参考
org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration
实现的,当时我在设计 state 缓存的不同实现的时候,发现这个逻辑不就跟数据源选择的逻辑一致么,所以是受他启发的
明白,我去看看!
完成了开发工作,也上传到了GitHub中:https://github.com/Vector6662/jap-spring-boot-starter 。写了使用文档。 这是使用本starter的一个demo:https://github.com/Vector6662/jap-spring-boot-starter-demo 。 @xkcoding 谢谢老师!
问题 1:我研究一下,在更新答案.. 问题 2:是的,现在是需要加上
Accept: application/json
才会返回 json 数据,这块我记得之前的是默认返回 json 的,可能 GitHub 做了调整问题1:谢谢沈老师!我也觉得东哥关于这个问题的回答有道理😄。 问题2:了解!是否需要修改一下jap源码呢?如果需要我可以试着提交一个PR。
问题2:这个应该是在 justauth 里面进行修复。可以尝试一下
另外,https://github.com/Vector6662/jap-spring-boot-starter-demo 这个项目也放到 组织里面吧,开发者用的时候方便找
另外,https://github.com/Vector6662/jap-spring-boot-starter-demo 这个项目也放到 组织里面吧,开发者用的时候方便找
好的!
ok,已经转过去了
oauth的scope参数为多个的情况下会有如下报错:
Illegal character in query at index 270:
https://oauth.aliyun.com/v1/token?
code=XXX&
client_secret=XXX&
redirect_uri=http://localhost:8080/oidc/aliyun&
grant_type=authorization_code&
client_id=4408723633922655083&
scope=aliuid openid profiles #中间用逗号或者空格分隔都会报错
我猜测应该是scope值之间的空格原因,同时 这里的encode为false。我测试了一下,如果将encode改为true,就可以请求成功:
若为false便会报错:
我的oathConfig实例的scope值如下:
进行post请求时:
@xkcoding @zhangyd-c 谢谢两位老师!
A: 这个就谈到 session 的生命周期了。一次会话理论上应该就是只保留一个用户信息的。你可以把 Session 理解为 ThreadLocal,每次会话相当于一个线程。session 之间是数据隔离的,不会影响到其他人。
A:不准确,需要再加一点修饰。同一个客户端发来的request在服务器「在一段时间内」对应的session是一个,因为 session 有默认的存活时间,过期了,就会重新创建一个。