欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > Day 28:Spring Security 与 OAuth 2.0

Day 28:Spring Security 与 OAuth 2.0

2025/6/27 12:17:00 来源:https://blog.csdn.net/weixin_49564779/article/details/145106009  浏览:    关键词:Day 28:Spring Security 与 OAuth 2.0

目标:学习如何在微服务架构中进行权限控制,掌握 OAuth 2.0 认证和授权。

理论知识

1. Spring Security 的基本概念与应用场景
  • Spring Security:是一个强大的认证与授权框架,提供了基于 HTTP 的安全性防护。它是实现微服务安全、Web 应用安全、API 安全等方面的核心工具。
  • 应用场景
    1. 认证:验证用户的身份,确保用户是其所声称的身份。
    2. 授权:决定用户是否有权限执行某个操作。
    3. 防御机制:防止常见的安全漏洞,如 CSRF、XSS、SQL 注入等。
2. OAuth 2.0 的认证流程
  • OAuth 2.0 是一种授权协议,用于保护用户数据,常用于授权第三方应用访问用户资源的场景。
  • OAuth 2.0 的授权流程分为几种模式,常见的有以下几种:
2.1 Authorization Code Flow(授权码流程)
  • 最常用的 OAuth 2.0 流程,适用于用户和服务器分离的 Web 应用。
  • 流程
    1. 用户请求访问保护资源。
    2. 应用重定向到授权服务器,用户登录并授权。
    3. 授权服务器将授权码返回给应用。
    4. 应用使用授权码向授权服务器申请令牌(access token)。
    5. 使用令牌访问保护资源。
2.2 Implicit Flow(隐式流程)
  • 适用于浏览器端单页应用(SPA)等场景,直接返回令牌而不需要授权码。
  • 相比授权码流程,隐式流程的安全性较低,通常仅用于浏览器应用。
2.3 Client Credentials Flow(客户端凭证流程)
  • 适用于机器与机器之间的授权(无用户参与),例如服务间的通信。
  • 客户端直接向授权服务器申请令牌,而无需用户的授权。
3. 配置 Spring Security 的基本方法
  • Spring Security 通过 HTTP Security 来配置 HTTP 请求的安全性,常见的配置有:
    1. 认证方式:基本认证、表单登录、OAuth 2.0 等。
    2. 授权规则:基于角色、基于权限的授权。
    3. CSRF 防护:保护 Web 应用免受跨站请求伪造攻击。

实践操作

要在 Spring Security 中配置一个认证服务器(Authorization Server),并使用 OAuth 2.0 认证流程,你可以借助 Spring Security OAuth2 提供的功能。虽然 Spring Security 官方在 5.x 中引入了更简洁的 OAuth2 支持,但 Spring Security OAuth(Spring Security OAuth2 Authorization Server)仍然是一个强大的工具,用于构建认证服务器。

以下是配置 Spring Security OAuth 认证服务器的步骤:

1. 添加 Maven 依赖

pom.xml 中,添加 Spring Security OAuth 和 Spring Boot 的相关依赖:

<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-oauth2-resource-server</artifactId></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-oauth2-authorization-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
</dependencies>
2. 创建认证服务器配置

使用 Spring Security OAuth 认证服务器,通常需要配置一些核心功能,比如授权端点、令牌端点等。

2.1 配置 OAuth2 认证服务器

在 Spring Security OAuth 认证服务器中,通常要配置以下几个内容:

  • Authorization Endpoint:用户授权的端点。
  • Token Endpoint:发放令牌的端点。
  • Client Registration:注册 OAuth 客户端。

以下是一个简单的认证服务器配置:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.InMemoryTokenStore;
import org.springframework.security.oauth2.provider.client.ClientDetailsService;
import org.springframework.security.oauth2.provider.client.InMemoryClientDetailsService;@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/oauth/authorize", "/oauth/token").permitAll().anyRequest().authenticated();}// 1. Token Store: 用于存储访问令牌@Beanpublic TokenStore tokenStore() {return new InMemoryTokenStore(); // 使用内存存储令牌}// 2. Client Details Service: 用于管理 OAuth 客户端@Beanpublic ClientDetailsService clientDetailsService() {InMemoryClientDetailsService service = new InMemoryClientDetailsService();// 配置 OAuth 客户端service.addClientDetails(clientDetails());return service;}// 3. 客户端详情:注册 OAuth 客户端private BaseClientDetails clientDetails() {BaseClientDetails clientDetails = new BaseClientDetails();clientDetails.setClientId("test-client");clientDetails.setClientSecret("{noop}secret");clientDetails.setAuthorizedGrantTypes(Arrays.asList("authorization_code", "password"));clientDetails.setScope(Arrays.asList("read", "write"));clientDetails.setRegisteredRedirectUri(Arrays.asList("http://localhost:8080/login/oauth2/code/test-client"));return clientDetails;}
}
3. 配置 OAuth2 客户端

在 Spring Boot 中,你需要为 OAuth2 客户端配置一些基本信息,例如客户端 ID、客户端密钥等。可以在 application.ymlapplication.properties 文件中配置这些信息。

3.1 配置 OAuth2 客户端
spring:security:oauth2:client:registration:test-client:client-id: test-clientclient-secret: secretauthorization-grant-type: authorization_coderedirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"scope: read, writeauthorization-uri: http://localhost:8080/oauth/authorizetoken-uri: http://localhost:8080/oauth/token
4. 配置授权码流程

你需要创建一个控制器,处理 OAuth2 授权码流程。当客户端请求访问某个受保护的资源时,OAuth2 授权服务器会重定向到授权端点,在用户授权后,客户端应用会收到一个授权码。

import org.springframework.security.oauth2.client.annotation.OAuth2Login;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class OAuth2Controller {@GetMapping("/login")@OAuth2Loginpublic String login() {return "Login page";}@GetMapping("/user")public String getUserInfo(@AuthenticationPrincipal OAuth2User principal) {return "Hello, " + principal.getName();}
}

在上面的代码中,@OAuth2Login 注解用于启用 OAuth2 登录功能,/user 接口通过 @AuthenticationPrincipal 获取当前用户信息。

5. 启动认证服务器

确保认证服务器已经启动并配置正确,然后使用客户端访问 http://localhost:8080/login,根据 OAuth 2.0 的授权码流程,你将会被重定向到授权服务器进行授权,授权成功后会返回令牌。

总结

  1. OAuth 2.0 认证服务器:Spring Security OAuth 提供了认证服务器的相关配置,帮助你搭建基于 OAuth 2.0 的认证与授权服务。
  2. 授权码流程:通过授权码流程保护应用资源,并使 OAuth 客户端能够通过令牌获取访问权限。
  3. Spring Security 配置:通过 AuthorizationServerConfigurerAdapter 类配置授权服务器,定义了 TokenStoreClientDetailsService 来管理令牌和客户端。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词