天天看点

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

开发环境:

windows10

intellij idea2018.2

jdk1.8

redis3.2.9

spring boot 2.0.2 release

spring cloud finchley.rc2

spring 5.0.6

项目目录

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

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。

先发送一个请求测试一下未认证的效果

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

获取认证

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

使用access_token请求auth服务下的用户信息接口

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

使用access_token请求member服务下的用户信息接口

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

请求member服务的query接口

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

请求member服务的hello接口,数据库里并没有给用户hello权限

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

刷新token

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

注销

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

后续还会慢慢完善,敬请期待!

关于代码和数据表sql已经上传到github。地址:https://github.com/wya1993/springcloud_oauth2.0。

注意把数据库和redis替换成自己的地址

原因是在发起请求的时候没有添加basic auth认证,如下图:

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

,添加basic auth认证后会在headers添加一个认证消息头

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

添加basic auth认证的信息在代码中有体现:

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

现在客户端信息都是存在内存中的,生产环境肯定不可以这么做,要支持客户端的动态添加或删除,所以我选择把客户端信息存到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中,需要的可以自行下载

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

然后在eshop_member数据库创建数据表,将客户端信息添加到oauth_client_details表中

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

如果你的密码不是明文,记得client_secret需要加密后存储。

然后修改代码,配置从数据库读取客户端信息

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

接下来启动服务测试即可。

获取授权

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

获取用户信息

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权
SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

打开数据表发现token这些信息并没有存到表中,因为tokenstore使用的是redis方式,我们可以替换为从数据库读取。修改配置

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权
SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

重启服务再次测试

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权
SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

查看数据表,发现token数据已经存到表里了。

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权
SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权