Spring Security + OAuth2.0项目搭建

一、Oauth2.0与Spring Security

1、OAuth2.0介绍

1.1 什么是OAuth2.0?

OAuth是 Open Authorization的简写。
OAuth协议为用户资源的授权提供了一个安全的、开放而又简易的标准(开放授权标准)。
它允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。

与以往的授权方式不同之处是 OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 OAuth是安全的。

Oauth协议目前发展到 2.0版本,1.0版本过于复杂,2.0版本已得到广泛应用。
OAuth2.0是 OAuth协议的延续版本,但不向后兼容 OAuth 1.0(即完全废止了 OAuth1.0)。

1.2 OAuth2.0协议包含的角色

  • 资源所有者(Resource Owner):
    能够授予对受保护资源的访问权限的实体。通常是用户(user),也可以是应用程序,即该资源的拥有者。
  • 认证服务器(Authorization server):
    又称为授权服务器,认证成功后会给客户端发放令牌(),作为客户端访问资源服务器的凭据。
    服务器认证成功后向客户端颁发访问令牌(access_token),作为客户端访问资源服务器的凭据,并验证资源所有者并获得授权。
    简单点说就是登录功能,用于服务提供者对资源拥有的身份进行认证,对访问资源进行授权。
  • 资源服务器(Resource server)
    托管受保护资源的服务器,能够接受并使用访问令牌响应受保护的资源请求。
  • 第三方应用程序(Third-party application): - 示例中的浏览器、微信客户端
    又称为客户端(client),本身不存储资源,需要通过资源拥有者的授权去请求资源服务器的资源。

1.3 OAuth2.0的四种授权模式

OAuth2定义了四种授权方式,其实是代表了OAuth授权三方的不同互信程度。
四种授权模式(authorization grant):

  1. Authorization code Grant:授权码模式,推荐使用
  2. Implicit Grant:隐藏/简化模式,不推荐使用
  3. Resource Owner Password Credentials Grant:密码模式
  4. Client Credentials Grant:客户端模式

1.4 OAuth2.0协议流程图

在这里插入图片描述

2、Spring Security

Spring 官方对于 OAuth2.0 的解释:

Spring Security OAuth 项目已弃用。Spring Security 提供了最新的 OAuth 2.0 支持。有关 OAuth2.0 的支持已经集成到了 Spring Security 里面了。

关于 Security OAuth2 重构说明,查看参考文章或者Spring官网。

参考文章:

  • Spring官网:https://projects.spring.io/spring-security-oauth/docs/oauth2.html
  • Spring Security 与 Oauth2.0:https://www.jianshu.com/p/e3d814ad4de0
  • Oauth百度百科:https://baike.baidu.com/item/oAuth/7153134?fr=aladdin
  • Oauth协议:https://datatracker.ietf.org/doc/html/rfc6749

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,但尚未标注被废弃

3、OAuth2.0表结构说明

建表语句:
官方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,刷新令牌等信息。

在这里插入图片描述
表结构说明:

  1. oauth_client_details 客户端账号密码、授权、回调地址等重要信息;核心表
  2. oauth_access_token 存储access_token
  3. oauth_refresh_token 存储refresh_token
  4. oauth_client_token 存储从服务端获取的token数据
  5. oauth_code 存储授权码
  6. oauth_approvals 存储授权成功的客户端信息

oauth_client_details核心表字段说明:
在这里插入图片描述

二、Spring Security + OAuth2.0项目搭建

下面我们搭建一个简单的 Spring Security + OAuth2.0微服务项目。

环境:

  • jdk14
  • Spring boot 2.3.6.RELEASE
  • Spring Cloud Hoxton.SR9
  • mysql 8

1、创建父工程

引入依赖:

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>14</maven.compiler.source>
    <maven.compiler.target>14</maven.compiler.target>
    <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
  </properties>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.6.RELEASE</version>
    <relativePath/>
  </parent>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

2、创建 Eureka服务

1)引入依赖:

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
<!-- eureka-server   -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </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);
	}
}

3、创建 OAuth2.0认证服务

认证授权服务只有一个。
1)引入依赖:

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-oauth2</artifactId>
<!--      <version>2.1.0.RELEASE</version>-->
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.23</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>2.1.0</version>
    </dependency>
<!--    JAXB API是java EE 的API,因此在java SE 9.0 中不再包含这个 Jar 包。需要手动引入
java 9 中引入了模块的概念,默认情况下,Java SE中将不再包含java EE 的Jar包 。而在 java 6/7 / 8 时关于这个API 都是捆绑在一起的。
参考文章:https://www.cnblogs.com/zq-kjy/p/9208556.html-->
    <dependency>
      <groupId>javax.xml.bind</groupId>
      <artifactId>jaxb-api</artifactId>
      <version>2.3.1</version>
    </dependency>
    <dependency>
      <groupId>com.sun.xml.bind</groupId>
      <artifactId>jaxb-impl</artifactId>
      <version>2.3.0</version>
    </dependency>
    <dependency>
      <groupId>com.sun.xml.bind</groupId>
      <artifactId>jaxb-core</artifactId>
      <version>2.3.0</version>
    </dependency>
    <dependency>
      <groupId>javax.activation</groupId>
      <artifactId>activation</artifactId>
      <version>1.1.1</version>
    </dependency>
<!--eureka-client-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </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);
    }
}

4、创建 资源1服务

同认证服务类同。资源服务可以创建多个。

在搭建过程中,遇到不少问题,比如:

  • jdk9 以上,会报错 javax.xml.bind 少包。
  • Spring Cloud Eureka配置安全验证时Client注册报错:Cannot execute request on any known serve

解决问题的过程中也了解不少知识,关于 Spring Security + OAuth2.0的配置项,后面接着搞。

启动项目ok。
在这里插入图片描述

– 求知若饥,虚心若愚。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值