1、概览 Springdoc-OpenAPI 是一个为 Spring Boot 应用程序自动生成 API 文档的框架。它实现了 OpenAPI 3 规范,使用它,通过 UI 界面就可以与 API 进行交互,非常方便。
在本教程中,我们将学习如何使用 Spring Security 通过表单登录和 Basic Authentication 来认证 springdoc 中的端点访问。
2、项目设置 创建一个 Spring Boot Web 应用程序,该应用程序将通过 Spring Security 保护 API,并使用 Springdoc 生成文档。
2.1、依赖 首先添加 springdoc-openapi-ui,它整合了 Swagger-UI,用于提供 UI 界面:
http://localhost:8080/swagger-ui.html 其次,添加 springdoc-openapi-security,用于为 Spring Security 提供支持:
<dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-ui</artifactId> <version>1.6.13</version> </dependency> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-security</artifactId> <version>1.6.13</version> </dependency> 2.2、示例 API 创建一个示例 REST Controller,Springdoc 会为其生成文档。
此外,我们将通过 Swagger-UI 来演示与 FooController 中受保护(需要认证)的端点进行交互。
@RestController @RequestMapping(value = "foos", produces = MediaType.
1、概览 Spring Boot CLI 是一个 Spring Boot 工具,用于从命令运行和测试 Spring Boot 应用。该工具提供了一个非常有用的密码编码功能,主要目的是避免暴露明文形式的密码。
在本教程中,我们将深入 Spring Security 的世界,学习如何使用 Spring Boot CLI 对密码进行编码。
2、密码编码 密码编码是一种将密码以二进制格式表示并保存在存储介质上的简单方法。我们可以使用 Spring Security 对密码进行编码,也可以通过 Spring Boot CLI 进行编码。
2.1、Spring Security PasswordEncoder Spring Security 提供了 PasswordEncoder 接口,并且预置了很多实现,如 StandardPasswordEncoder 和 BCryptPasswordEncoder。
此外,Spring Security 建议使用基于强大算法和随机生成盐值的 BCryptPasswordEncoder。在框架的早期版本中,可以使用 MD5PasswordEncoder 或 SHAPasswordEncoder 类,但由于其算法的弱点,它们现在已被弃用,这两个类强制开发者将盐作为构造函数参数传递。而 BCryptPasswordEncoder 将在内部生成随机盐,BCryptPasswordEncoder 生成的字符串大小为 60 个字符。
而 StandardPasswordEncoder 类则基于 SHA-256 算法。
显然,在第三方系统中创建的用户密码必须按照 Spring Security 中选择的编码类型进行编码,这样才能成功进行身份认证。
2.2、Spring Boot CLI Password Encoder Spring Boot CLI 提供了许多命令,其中之一就是 encodepassword。该命令允许对密码进行编码,以便与 Spring Security 配合使用。简单地说,Spring Boot Cli 可以使用这种简单的 encodepassword 命令直接将原始密码转换为加密密码:
1、概览 身份认证是微服务安全的基础。我们可以通过各种方式实现身份认证,如使用基于用户的凭证、证书或 token。
在本教程中,我们将学习如何使用 Spring Security 实现服务间的通信认证。
2、自定义身份认证简介 在某些情况下,使用 Oauth2 或存储在数据库中的密码可能并不可行,因为私有微服务不需要基于用户的交互。然而,我们仍然应该保护应用程序免受任何无效请求的影响。
在这种情况下,我们可以设计一种简单的身份认证技术,使用自定义 header。应用程序将根据预先配置的请求头认证请求。
我们还应在应用程序中启用 TLS,以确保 header 在网络传输中的安全。
我们可能还需要确保一些端点不需要进行任何身份认证,例如 health 或 error 端点。
3、示例应用 假如,我们需要用几个 REST API 构建一个微服务。
3.1、Maven 依赖 首先,我们将创建一个 Spring Boot Web 项目,添加 spring-boot-starter-web 和 spring-boot-starter-test 依赖。
<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.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> 3.2、实现 REST Controller 我们的应用有两个端点,一个端点可通过 secret header 访问,另一个端点可被网络中的所有用户访问。
首先,在 APIController 中实现 /hello 端点:
@GetMapping(path = "/api/hello") public String hello(){ return "hello"; } 然后,我们将在 HealthCheckController 类中实现 /health 端点:
1、概览 在 web 开发过程中,经常会遇到 HTTP 403 forbidden error。
在本教程中,我们将学习如何解决 Spring Boot POST 请求中的 403 错误。我们将首先了解 403 错误的含义,然后探讨在 Spring Boot 应用程序中解决该错误的步骤。
2、403 Error 是什么? HTTP 403 错误(通常称为 “Forbidden” 错误)是一种状态代码,表示服务器理解了请求,但选择不授权。这通常意味着客户端没有权限访问请求的资源。
需要注意的是,该错误不同于 401 错误,后者表示服务器需要对客户端进行身份认证,但尚未收到有效凭证。
“401” 表示需要认证,“403” 表示认证过了(不需要认证),但是没有权限。
3、导致 403 Error 的原因 在 Spring Boot 应用程序中,有几个因素会触发 403 错误。其中之一就是客户端未能提供身份认证凭据。在这种情况下,服务器因无法认证客户端的权限而拒绝请求,从而导致 403 错误。
另一个可能的原因在于服务器配置(server configuration)。例如,出于安全原因,服务器可能被配置为拒绝来自某些 IP 地址或用户代理(user agent)的请求。如果请求来自这些被阻止的资源,服务器会响应 403 错误。
此外,Spring Security 默认启用跨站请求伪造(CSRF)保护。CSRF 是一种通过欺骗受害者提交恶意请求并利用受害者的凭证代表其执行非预期功能的攻击。如果用于防范此类攻击的 CSRF token 丢失或不正确,服务器也可能会响应 403 错误。
4、项目设置 要了解如何解决 403 错误,让我们创建一个带有 spring-boot-starter-web 和 spring-boot-starter-security 依赖的 Spring Boot 项目:
1、概览 在任何现代浏览器中,随着通过 REST API 获取数据的 HTML5 和 JS 客户端的出现,跨源资源共享 (CORS) 已成为一种相关规范。
通常,提供 JS 的主机(如 example.com)与提供数据的主机(如 api.example.com)不同。在这种情况下,CORS 可以实现跨域通信。
Spring 为 CORS 提供了一流的 支持,为在任何 Spring 或 Spring Boot Web 应用中配置 CORS 提供了简单而强大的方法。
2、Controller 方法级的 CORS 配置 启用 CORS 非常简单,只需添加注解 @CrossOrigin。
我们可以通过几种不同的方式来实现。
2.1、在 @RequestMapping 方法上注解 @CrossOrigin @RestController @RequestMapping("/account") public class AccountController { @CrossOrigin @RequestMapping(method = RequestMethod.GET, path = "/{id}") public Account retrieve(@PathVariable Long id) { // ... } @RequestMapping(method = RequestMethod.DELETE, path = "/{id}") public void remove(@PathVariable Long id) { // .
1、概览 安全在 REST API 开发中起着至关重要的作用。不安全的 REST API 可以直接访问后端系统的敏感数据。因此,企业需要关注 API 的安全性。
Spring Security 提供了各种机制来保护我们的 REST API。其中之一就是 API key。API key 是客户端在调用 API 时提供的 Token。
在本教程中,我们将讨论 Spring Security 中基于 API key 的身份认证的实现。
2、REST API 安全 Spring Security 可用于保护 REST API。REST API 是无状态的。因此,它们不应使用会话或 cookie。相反,它们应该使用 Basic authentication、API key、JWT 或基于 OAuth2 的 token 来确保安全。
2.1、Basic Authentication Basic authentication 是一种简单的身份认证方案。客户端发送 HTTP 请求时,Authorization 包含 Basic 字样,后面跟一个空格和一个 Base64 编码的字符串 username:password。Basic authentication 只有在使用 HTTPS/SSL 等其他安全机制时才被认为是安全的。
2.2、OAuth2 OAuth2 是 REST API 安全性的事实标准。它是一个开放的身份认证和授权标准,允许资源所有者通过 access token 权客户端访问私有数据。