Spring Authorization Server入门 (八) Spring Boot引入Security OAuth2 Client对接认证服务

这篇具有很好参考价值的文章主要介绍了Spring Authorization Server入门 (八) Spring Boot引入Security OAuth2 Client对接认证服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在之前的文章中实现了一个认证服务,并且添加了一些自定义的内容,现在暂时没想到认证服务的新内容,本篇文章就先写一下客户端对接的吧,水一篇。

流程说明

spring security oauth2 client,Spring Authorization Server,Spring Security,Spring,spring boot,spring,java

当用户通过客户端去访问一个受限的资源时,客户端会检测是否有登录信息,没有登录信息会重定向至认证服务器去请求授权,认证服务器会检测是否有登录信息(检查session),检测到没有登录则重定向至登录页面返回给用户,用户输入账号密码后提交,认证服务器认证以后会重定向至授权接口,授权接口生成一个code之后携带code重定向至客户端配置的redirect_uri,Security OAuth2 Client默认实现了一个处理回调的接口,会自动使用code获取token,地址为:/login/oauth2/code/*,最后的*要填配置客户端的registrationId,后边会提到;然后该接口请求认证服务去获取一个access_token,用access_token换取用户信息,框架会将token的信息存入session中,以后再发起请求时会从session中获取token。

使用SpringBoot创建一个oauth2客户端

环境介绍

客户端这里就是一个独立的项目了,跟之前的认证服务没有什么关联,读者可自选自己使用的Spring Boot版本,各版本的oauth2 client版本的对接大差不差,基本上差不多,可能实现会有所不同,但基本都一样的。在对接过程中我会放一些文档,读者可以去文档中找对应版本的文档去编写代码。

创建项目

使用idea或者在Spring Initializr创建一个SpringBoot项目;创建时引用oauth2-client和web依赖。

spring security oauth2 client,Spring Authorization Server,Spring Security,Spring,spring boot,spring,java

pom.xml示例

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>authorization-client-example</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>authorization-client-example</name>
    <description>authorization-client-example</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置application.yml,添加认证服务器信息和客户端信息

server:
  # 修改端口
  port: 8000

spring:
  security:
    oauth2:
      client:
        provider:
          # 认证提供者,自定义名称
          custom-issuer:
            # Token签发地址(认证服务地址)
            issuer-uri: http://192.168.120.33:8080
            # 获取用户信息的地址,默认的/userinfo端点需要IdToken获取,为避免麻烦自定一个用户信息接口
            user-info-uri: ${spring.security.oauth2.client.provider.custom-issuer.issuer-uri}/user
        registration:
          messaging-client-oidc:
            # oauth认证提供者配置,和上边配置的认证提供者关联起来
            provider: custom-issuer
            # 客户端名称,自定义
            client-name: message-client
            # 客户端id,从认证服务申请的客户端id
            client-id: messaging-client
            # 客户端秘钥
            client-secret: 123456
            # 客户端认证方式
            client-authentication-method: client_secret_basic
            # 获取Token使用的授权流程
            authorization-grant-type: authorization_code
            # 回调地址,这里设置为Spring Security Client默认实现使用code换取token的接口
            redirect-uri: http://127.0.0.1:8000/login/oauth2/code/messaging-client-oidc
            scope:
              - message.read
              - message.write

更多详细的客户端配置信息移步官网文档
文档中配置权限范围的字段是scopes,但是在代码中是scope,这里可能是文档中没更新吧,大家在参阅文档时需要注意一下代码中具体的属性名是什么。

注意:认证服务器和客户端在同一个机器上时不能使用同一个ip,例如127.0.0.1,在存储cookie时不会区分端口的,比如127.0.0.1:8000和127.0.0.1:8080这两个,他们的cookie是同一个的,后者会覆盖前者;如果配置认证服务的地址是127.0.0.1:8080然后通过127.0.0.1:8000去访问客户端则会在登录后出现[authorization_request_not_found]异常,详见spring-security issues 5946

给认证服务添加一个用户接口

在AuthorizationController中添加/user接口

@ResponseBody
@GetMapping("/user")
public Map<String,Object> user(Principal principal) {
    if (!(principal instanceof JwtAuthenticationToken token)) {
        return Collections.emptyMap();
    }
    return token.getToken().getClaims();
}

测试

综上所述,一个很简单的客户端已经配置完成了。

编写一个测试接口

直接将认证服务的测试接口copy过来

package com.example.controller;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 测试接口
 *
 * @author vains
 */
@RestController
public class TestController {

    @GetMapping("/test01")
    @PreAuthorize("hasAuthority('SCOPE_message.read')")
    public String test01() {
        return "test01";
    }

    @GetMapping("/test02")
    @PreAuthorize("hasAuthority('SCOPE_message.write')")
    public String test02() {
        return "test02";
    }

    @GetMapping("/app")
    @PreAuthorize("hasAuthority('app')")
    public String app() {
        return "app";
    }

}

开始测试

1. 启动认证服务

spring security oauth2 client,Spring Authorization Server,Spring Security,Spring,spring boot,spring,java
2. 启动客户端服务

spring security oauth2 client,Spring Authorization Server,Spring Security,Spring,spring boot,spring,java
3. 访问客户端的/app接口
spring security oauth2 client,Spring Authorization Server,Spring Security,Spring,spring boot,spring,java

机制说明

看到这里可能有些读者会比较疑惑,比如框架怎么知道认证服务器授权接口的地址?框架怎么知道认证服务获取token的接口?
项目在初始化时会根据配置的issuer-uri拼接url,即签发地址根目录/.well-known/openid-configuration,像项目中配置的就是http://192.168.120.33:8080/.well-known/openid-configuration ;该接口会返回认证服务器的元信息,如下:

spring security oauth2 client,Spring Authorization Server,Spring Security,Spring,spring boot,spring,java
所以通过该接口就可以很清楚的知道各授权端点的请求路径。

客户端注册信息

默认是基于内存的,基本上来说服务注册的客户端不会很多,基于内存也就够用了;框架也提供了基于db的方式,需要自己注入一个JdbcOAuth2AuthorizedClientService;让客户端认证信息持久化。文档

sql位置

spring security oauth2 client,Spring Authorization Server,Spring Security,Spring,spring boot,spring,java

客户端解释

客户端在oauth2角色解释中是第三方的一个应用,一般会配合资源服务一起使用

  1. 在单体项目中:
    会同时添加资源服务依赖,客户端负责调用认证服务登录,资源服务器负责解析获取到的token,然后获取token中的权限,目前token中的权限只有scope的权限,并且不太好自定义,所以就需要通过资源服务器配置去更好的解析token。
  2. 在分布式项目中:
  • 在网关中添加客户端依赖,检查用户认证信息,由网关代理的微服务添加资源服务依赖,解析网关通过令牌中继的方式携带的access_token;各个微服务添加自己的授权校验。
  • 在网关中集成客户端依赖,同时集成资源服务依赖,由网关检查用户的认证和授权信息;各个微服务不用添加任何的认证与授权相关的处理,可以直接访问;这种方式需要屏蔽各微服务其它ip的访问,只能由网关代理访问。

总结

本篇文章以较少的代码集成了Security OAuth2 Client,体验到了springboot最开始说的约定大于配置的好处,框架添加了大量的默认配置,只需更改必须修改的自定义部分即可,本次的代码部分只有更改yml和编写一个测试接口,其它的重定向至认证服务和获取token的配置都已经默认实现了。

下篇会记录一下资源客户端的集成。

代码已提交至Gitee:https://gitee.com/vains-Sofia/authorization-example文章来源地址https://www.toymoban.com/news/detail-834084.html

到了这里,关于Spring Authorization Server入门 (八) Spring Boot引入Security OAuth2 Client对接认证服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战

    项目源码 :youlai-mall 通过 Spring Cloud Gateway 访问认证中心进行认证并获取得到访问令牌。 再根据访问令牌 access_token 获取当前登录的用户信息。 Spring Security OAuth2 的最终版本是2.5.2,并于2022年6月5日正式宣布停止维护。Spring 官方为此推出了新的替代产品,即 Spring Authorization

    2024年02月04日
    浏览(39)
  • OAuth2.0 实践 Spring Authorization Server 搭建授权服务器 + Resource + Client

    title: OAuth2.0 实践 Spring Authorization Server 搭建授权服务器 + Resource + Client date: 2023-03-27 01:41:26 tags: OAuth2.0 Spring Authorization Server categories: 开发实践 cover: https://cover.png feature: false 目前 Spring 生态中的 OAuth2 授权服务器是 Spring Authorization Server ,原先的 Spring Security OAuth 已经停止更新

    2024年02月08日
    浏览(53)
  • 浅析spring-security-oauth2-authorization-server

            在 Spring 中, Shiro 和 spring-security 是比较常用的安全框架解决方案,  shiro 在中小型项目中使用通常来说既简单, 也能达到常规的需求, 如果项目较为复杂, 建议 spring-security         Spring Security OAuth2.0 已经停止维护,  oauth2-authorization-server 是目前官方推荐的安全框架

    2024年02月11日
    浏览(29)
  • Spring Boot 中如何使用 Spring Security OAuth2 来实现单点登录

    在现代 Web 应用程序中,单点登录(Single Sign-On,简称 SSO)是一个非常重要的功能。Spring Security OAuth2 是 Spring Security 框架的一个扩展,它提供了一种简单的方式来实现 SSO。在本文中,我们将介绍如何在 Spring Boot 应用程序中使用 Spring Security OAuth2 来实现单点登录。 在开始之前

    2024年02月06日
    浏览(41)
  • Spring Security OAuth2.0(3):Spring Security简单入门

    Spring Security 快速入门。 本章代码已分享至Gitee:https://gitee.com/lengcz/security-spring-security qquad Spring Secutiry 是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是Spring生态系统的一员,因此它伴随着整个Spring生态系统不断修正、升级,

    2024年02月13日
    浏览(45)
  • spring-security-oauth2-authorization-server(一)SpringBoot3.1.3整合

    因为SpringBoot3.x是目前最新的版本,整合spring-security-oauth2-authorization-server的资料很少,所以产生了这篇文章,主要为想尝试SpringBoot高版本,想整合最新的spring-security-oauth2-authorization-server的初学者,旨在为大家提供一个简单上手的参考,如果哪里写得不对或可以优化的还请大家

    2024年02月03日
    浏览(39)
  • Spring Authorization Server入门 (二) springboot整合Spring Authorization Server

    在新版本的sas(1.2.1)中获取token更新了授权码校验逻辑,只能用form-data传递参数,使用url-params会失败,原因见issue1451 对应的 commit 在这里: Fix to ensure endpoints distinguish between form and query parameters 文章较长,步骤比较繁琐,请各位读者耐心观看。 上篇文章大概了解了下框架的相关

    2024年02月13日
    浏览(58)
  • Springboot 3 + Spring Security 6 + OAuth2 入门级最佳实践

    当我的项目基于 SpringBoot 3 而我想使用Spring Security,最终不幸得到WebSecurityConfigurerAdapter被废弃的消息。本文档就是在这样的情况下产生的。 应该基于: SpringBoot 3.x版本 JDK 17 在浏览器访问默认8080端口可以得到默认授权页面: 用户名为user,密码在控制台中自动生成: 写一个测

    2024年02月08日
    浏览(41)
  • 【spring authorization server系列教程】(一)入门系列,spring authorization server简介。快速构建一个授权服务器(基于最新版本0.3.0)

    【spring authorization server系列教程】(一)入门系列,快速构建一个授权服务器 spring authorization server是spring团队最新的认证授权服务器,之前的oauth2后面会逐步弃用。不过到现在发文的时候,我看到官网已经把之前oauth2仓库废弃了。 现在spring authorization server已经到生产就绪阶段了

    2024年02月05日
    浏览(47)
  • Spring Authorization Server入门 (十六) Spring Cloud Gateway对接认证服务

            之前虽然单独讲过Security Client和Resource Server的对接,但是都是基于Spring webmvc的,Gateway这种非阻塞式的网关是基于webflux的,对于集成Security相关内容略有不同,且涉及到代理其它微服务,所以会稍微比较麻烦些,今天就带大家来实现Gateway网关对接OAuth2认证服务。

    2024年02月10日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包