最近工作内容设到将我们平台的数据分享给第三方平台。了解到spring基于oauth2.0有这样的组件。在挣扎了一番后简单的应用基本没问题了。记录一下哈哈。
1 什么是 oath2?
讲的的大体就是在说,是一种新的认证和授权的 协议和标准。
它有几个角色我们必须要知道。
Resource Owner 资源拥有者 (对我而言是我们系统的用户)
client 客户端 (第三方 )
Authorization Server 认证服务器 (对我而言。我们系统检验第三方有没有资格获取我们系统的数据,颁发令牌给第三方)
ResourceSever 资源服务器 (受保护的资源服务,我们用户信息的模块)
oauth2 有好几种 模式认证,我们采用的是流程比较完善的授权码模式
先贴一下 pom.xml springboot 1.x 和 2.x 变化还是 很大的 要注意版本匹配。
1.8
Greenwich.SR1
org.springframework.cloud
spring-cloud-starter-oauth2
org.springframework.cloud
spring-cloud-starter-security
org.springframework.boot
spring-boot-starter-test
test
com.alibaba
druid
1.1.6
mysql
mysql-connector-java
5.1.46
org.springframework
spring-jdbc
4.2.5.RELEASE
com.baomidou
mybatis-plus-boot-starter
3.1.1
org.apache.commons
commons-lang3
3.4
org.freemarker
freemarker
2.3.28
org.springframework.boot
spring-boot-starter-tomcat
2.1.3.RELEASE
com.alibaba
fastjson
1.2.54
还有官方指定的 数据表 每个表用后面介绍
-- used in tests that use HSQL
create table oauth_client_details (
client_id VARCHAR(128) PRIMARY KEY,
resource_ids VARCHAR(128),
client_secret VARCHAR(128),
scope VARCHAR(128),
authorized_grant_types VARCHAR(128),
web_server_redirect_uri VARCHAR(128),
authorities VARCHAR(128),
access_token_validity INTEGER,
refresh_token_validity INTEGER,
additional_information VARCHAR(4096),
autoapprove VARCHAR(128)
);
create table oauth_client_token (
token_id VARCHAR(128),
token BLOB,
authentication_id VARCHAR(128) PRIMARY KEY,
user_name VARCHAR(128),
client_id VARCHAR(128)
);
create table oauth_access_token (
token_id VARCHAR(128),
token BLOB,
authentication_id VARCHAR(128) PRIMARY KEY,
user_name VARCHAR(128),
client_id VARCHAR(128),
authentication BLOB,
refresh_token VARCHAR(128)
);
create table oauth_refresh_token (
token_id VARCHAR(128),
token BLOB,
authentication BLOB
);
create table oauth_code (
code VARCHAR(128), authentication BLOB
);
create table oauth_approvals (
userId VARCHAR(128),
clientId VARCHAR(128),
scope VARCHAR(128),
status VARCHAR(10),
expiresAt TIMESTAMP,
lastModifiedAt TIMESTAMP
);
-- customized oauth_client_details table
create table ClientDetails (
appId VARCHAR(128) PRIMARY KEY,
resourceIds VARCHAR(128),
appSecret VARCHAR(128),
scope VARCHAR(128),
grantTypes VARCHAR(128),
redirectUrl VARCHAR(128),
authorities VARCHAR(128),
access_token_validity INTEGER,
refresh_token_validity INTEGER,
additionalInformation VARCHAR(4096),
autoApproveScopes VARCHAR(128)
);
下面我们看看具体的配置
一 数据源。
package com.oath2test.auth2server.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* 配置阿里数据源
*/
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druid() {
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer();
scannerConfigurer.setBasePackage("com.oath2test.**.mapper");
return scannerConfigurer;
}
}
对应的配置文件
spring:
application:
name: authServer
datasource:
url: jdbc:mysql://XXXXXXX/auth2test?useUnicode=true&serverTimezone=UTC&useSSL=false
password: xxxxxxx
username: root
driver-class-name: com.mysql.jdbc.Driver
platform: mysql
type: com.alibaba.druid.pool.DruidDataSource
# 初始化大小,最小,最大
initialSize: 1
minIdle: 3
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 30000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,wall,slf4j
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
二 WebSecurityConfigurerAdapter
oauth2.0 只是个协议标准。 内部实现是由 spring Security 安全框架。我们需要继承 WebSecurityConfigurerAdapter 来配置
Security 的一些组件。
AuthenticationManager : 授权认证管理器
PasswordEncoder:加密解密的组件
UserDetailsService:开放给使用者的 用户 登陆 退出 权限相关的 接口 使用时 要重写相关的 方法 备框架调用
UserDetails: 封装 用户状态的实体