需求
在微服务架构中,我们有很多业务模块,每个模块都需要有用户认证,权限校验。有时候也会接入来自第三方厂商的应用。要求是只登录一次,即可在各个服务的授权范围内进行操作。看到这个需求,立马就想到了这不就是单点登录吗?于是基于这样的需求,作者使用spring-cloud-oauth2去简单的实现了下用户认证和单点登录。
相关介绍
OAuth2
OAuth2是一个关于授权的网络标准,他定制了设计思路和执行流程。OAuth2一共有四种授权模式:授权码模式(authorization code)、简化模式(implicit)、密码模式(resource owner password)和客户端模式(client credentials)。数据的所有者告诉系统同意授权第三方应用进入系统,获取这些数据。于是数据所有者生产了一个短时间内有效的授权码(token)给第三方应用,用来代替密码,供第三方使用。具体流程请看下图,具体的OAuth2介绍,可以参考这篇文章,写的很详细。(https://www.jb51.net/article/198292.htm)
Token
令牌(token)和密码(password)的作用是一样的,都可以进入系统获取资源,但是也有几点不同:
令牌是短期的,到期会自动失效,用户无法修改。密码是长期的,用户可以修改,如果不修改,就不会发生变化。
令牌可以被数据所有者撤销,令牌会立即失效。密码一般不允许其他人撤销,只能被操作权限更高的人或者本人修改/重制。
令牌是有权限范围的,会被数据所有者授予。
实现的功能
本篇介绍的是通过密码模式来实现单点登录的功能。
在微服务架构中,我们的一个应用可能会有很多个服务运行,协调来处理实际的业务。这就需要用到单点登录的技术,来统一认证调取接口的是哪个用户。那总不能请求一次,就认证一次,这么做肯定是不行的。那么就需要在认证完用户之后,给这个用户授权,然后发一个令牌(token),有效期内用户请求资源时,就只需要带上这个标识自己身份的token即可。
架构说明
认证中心:oauth2-oauth-server,OAuth2的服务端,主要完成用户Token的生成、刷新、验证等。
微服务:mzh-etl,微服务之一,接收到请求之后回到认证中心(oauth2-oauth-server)去验证。
代码实现
使用到的框架是java基础的spring boot 和spring-cloud-oauth2
认证中心:
1、引入需要的maven包
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-oauth2
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.boot
spring-boot-starter-actuator
因为spring-cloud-starter-oauth2中包含了spring-cloud-starter-security,所以就不用再单独引入了,引入redis包是为了使用redis来存储token。
2、配置application.yml
这里主要用到的是redis的配置,mysql数据库的配置暂时没有用到。
spring:
application:
name: oauth-server
datasource:
url: jdbc:mysql://localhost:3306/mzh_oauth?useSSL=false&characterEncoding=UTF-8
username: root
password: admin123
driver-class-name: com.mysql.jdbc.Driver
hikari:
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
maximum-pool-size: 9
redis:
database: 0
host: localhost
port: 6379
jedis:
pool:
max-active: 8
max-idle: 8
min-idle: 0
timeout: 10000
server:
port: 8888
use-forward-headers: true
management:
endpoint:
health:
enabled: true
<