OAuth是 Open Authorization的简写。
OAuth协议为用户资源的授权提供了一个安全的、开放而又简易的标准(开放授权标准)。
它允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。
与以往的授权方式不同之处是 OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 OAuth是安全的。
Oauth协议目前发展到 2.0版本,1.0版本过于复杂,2.0版本已得到广泛应用。
OAuth2.0是 OAuth协议的延续版本,但不向后兼容 OAuth 1.0(即完全废止了 OAuth1.0)。
OAuth2定义了四种授权方式,其实是代表了OAuth授权三方的不同互信程度。
四种授权模式(authorization grant):
Spring 官方对于 OAuth2.0 的解释:
Spring Security OAuth 项目已弃用。Spring Security 提供了最新的 OAuth 2.0 支持。有关 OAuth2.0 的支持已经集成到了 Spring Security 里面了。
关于 Security OAuth2 重构说明,查看参考文章或者Spring官网。
参考文章:
Security OAuth2依赖傻傻分不清,目前:
spring-security-oauth2 -> 被废弃,建议不使用,否则后期无法维护
spring-security-oauth2-autoconfigure -> 自动配置,没有用处
spring-boot-starter-oauth2-client -> 最新
spring-boot-starter-oauth2-resource-server -> 最新
spring-cloud-starter-oauth2 -> 引用 spring-security-oauth2,但尚未标注被废弃
建表语句:
官方SQL地址:https://github.com/spring-projects/spring-security-oauth/blob/main/spring-security-oauth2/src/test/resources/schema.sql
和Oauth2有关有6张表,oauth_client_details表
就是保存 Oauth2客户端账号密码、授权、回调地址等重要信息的表,其他的表都是存储令牌、code,刷新令牌等信息。
下面我们搭建一个简单的 Spring Security + OAuth2.0微服务项目。
环境:
引入依赖:
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>14maven.compiler.source>
<maven.compiler.target>14maven.compiler.target>
<spring-cloud.version>Hoxton.SR9spring-cloud.version>
properties>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.6.RELEASEversion>
<relativePath/>
parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
1)引入依赖:
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-securityartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
dependencies>
2)yml配置文件:
server:
port: 18090
servlet:
context-path: /
spring:
application:
# 服务实例名
name: EUREKA-SERVER
security:
user:
name: admin
password: 1qaz2wsx
eureka:
instance:
# 服务主机名称
hostname: localhost
client:
service-url:
defaultZone: http://admin:1qaz2wsx@${eureka.instance.hostname}:18090/eureka/
3)SpringSecurity配置类:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().ignoringAntMatchers("/eureka/**");
super.configure(http);
}
}
4)启动类:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
认证授权服务只有一个。
1)引入依赖:
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-securityartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-oauth2artifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.23version>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>2.1.0version>
dependency>
<dependency>
<groupId>javax.xml.bindgroupId>
<artifactId>jaxb-apiartifactId>
<version>2.3.1version>
dependency>
<dependency>
<groupId>com.sun.xml.bindgroupId>
<artifactId>jaxb-implartifactId>
<version>2.3.0version>
dependency>
<dependency>
<groupId>com.sun.xml.bindgroupId>
<artifactId>jaxb-coreartifactId>
<version>2.3.0version>
dependency>
<dependency>
<groupId>javax.activationgroupId>
<artifactId>activationartifactId>
<version>1.1.1version>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
dependencies>
2)yml配置文件:
server:
port: 18091
# jsp配置
spring:
application:
# 服务实例名,每个服务名必须唯一
name: OAUTH-SERVER
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/security_authority?useUnicode=true;characterEncoding=utf8;useSSL=true;serverTimezone=GMT
username: root
password: 123456
main:
allow-bean-definition-overriding: true #允许我们自己覆盖spring放入到IOC容器的对象
# mybatis配置
mybatis:
configuration:
map-underscore-to-camel-case: true
mapper-locations: classpath:mybatis/mapper/*.xml
logging:
level:
com.charge.learn.springsecurity.oauth2.parent.oauth.dao: debug
eureka:
instance:
# 服务主机名称
hostname: localhost
client:
service-url:
defaultZone: http://admin:1qaz2wsx@${eureka.instance.hostname}:18090/eureka/
3)启动类:
@SpringBootApplication
@MapperScan("com.charge.learn.springsecurity.oauth2.parent.oauth.dao")
@EnableEurekaClient
public class OAuthServerApplication {
public static void main(String[] args) {
SpringApplication.run(OAuthServerApplication.class, args);
}
}
同认证服务类同。资源服务可以创建多个。
在搭建过程中,遇到不少问题,比如:
解决问题的过程中也了解不少知识,关于 Spring Security + OAuth2.0的配置项,后面接着搞。
– 求知若饥,虚心若愚。