开发环境:
windows10
intellij idea2018.2
jdk1.8
redis3.2.9
spring boot 2.0.2 release
spring cloud finchley.rc2
spring 5.0.6
项目目录
eshop —— 父级工程,管理jar包版本
eshop-server —— eureka服务注册中心
eshop-gateway —— zuul网关
eshop-auth —— 授权服务
eshop-member —— 会员服务
eshop-email —— 邮件服务(暂未使用)
eshop-common —— 通用类
首先构建eshop-auth服务,引入相关依赖
接下来,配置mybatis、redis、eureka,贴一下配置文件
authapplication添加@enablediscoveryclient和@mapperscan注解。
接下来配置认证服务器authorizationserverconfig ,并添加@configuration和@enableauthorizationserver注解,其中clientdetailsserviceconfigurer配置在内存中,当然也可以从数据库读取,以后慢慢完善。
在上述配置中,认证的token是存到redis里的,如果你这里使用了spring5.0以上的版本的话,使用默认的redistokenstore认证时会报如下异常:
原因是spring-data-redis 2.0版本中set(string,string)被弃用了,要使用redisconnection.stringcommands().set(…),所有我自定义一个redistokenstore,代码和redistokenstore一样,只是把所有conn.set(…)都换成conn..stringcommands().set(…),测试后方法可行。
配置资源服务器
配置spring security
可以看到resourceserverconfig 是比securityconfig 的优先级低的。
二者的关系:
resourceserverconfig 用于保护oauth相关的endpoints,同时主要作用于用户的登录(form login,basic auth)
securityconfig 用于保护oauth要开放的资源,同时主要作用于client端以及token的认证(bearer auth)
所以我们让securityconfig优先于resourceserverconfig,且在securityconfig 不拦截oauth要开放的资源,在resourceserverconfig 中配置需要token验证的资源,也就是我们对外提供的接口。所以这里对于所有微服务的接口定义有一个要求,就是全部以/api开头。
如果这里不这样配置的话,在你拿到access_token去请求各个接口时会报 invalid_token的提示。
另外,由于我们自定义认证逻辑,所以需要重写userdetailservice
密码验证为了方便我使用了不加密的方式,重写了passwordencoder,实际开发还是建议使用bcryptpasswordencoder。
另外,oauth的密码模式需要authenticationmanager支持
定义一个controller,提供两个接口,/api/member用来获取当前用户信息,/api/exit用来注销当前用户
引入依赖
配置文件配置
memberapplication主类配置
提供对外接口
配置文件
zuulapplication主类
spring security配置
接下来分别启动eshop-server、eshop-member、eshop-auth、eshop-gateway。
先发送一个请求测试一下未认证的效果
获取认证
使用access_token请求auth服务下的用户信息接口
使用access_token请求member服务下的用户信息接口
请求member服务的query接口
请求member服务的hello接口,数据库里并没有给用户hello权限
刷新token
注销
后续还会慢慢完善,敬请期待!
!
关于代码和数据表sql已经上传到github。地址:https://github.com/wya1993/springcloud_oauth2.0。
注意把数据库和redis替换成自己的地址
原因是在发起请求的时候没有添加basic auth认证,如下图:
,添加basic auth认证后会在headers添加一个认证消息头
添加basic auth认证的信息在代码中有体现:
现在客户端信息都是存在内存中的,生产环境肯定不可以这么做,要支持客户端的动态添加或删除,所以我选择把客户端信息存到mysql中。
首先,创建数据表,数据表的结构官方已经给出,地址在
https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/test/resources/schema.sql
其次,需要修改一下sql脚本,把主键的长度改为128,longvarbinary类型改为blob,调整后的sql脚本:
调整后的sql脚步也放到了github中,需要的可以自行下载
然后在eshop_member数据库创建数据表,将客户端信息添加到oauth_client_details表中
如果你的密码不是明文,记得client_secret需要加密后存储。
然后修改代码,配置从数据库读取客户端信息
接下来启动服务测试即可。
获取授权
获取用户信息
打开数据表发现token这些信息并没有存到表中,因为tokenstore使用的是redis方式,我们可以替换为从数据库读取。修改配置
重启服务再次测试
查看数据表,发现token数据已经存到表里了。