在Java中实现单点登录(Single Sign-On, SSO)通常涉及以下几个步骤:
-
选择SSO协议:常见的SSO协议包括OAuth 2.0、OpenID Connect、SAML等。
-
构建认证中心:创建一个认证中心(Authentication Server),负责用户的认证和授权。
-
集成服务提供者:将不同的服务提供者(Service Providers)集成到认证中心中,使它们能够共享认证信息。
-
实现客户端应用:开发客户端应用程序,使其能够与认证中心进行交互,获取认证凭据并访问受保护资源。
下面是一个简单的示例,使用Spring Security和OAuth 2.0实现单点登录:
1. 添加依赖
首先,在你的pom.xml
文件中添加Spring Security和OAuth 2.0的依赖:
org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-oauth2-client org.springframework.boot spring-boot-starter-web
2. 配置认证中心
创建一个配置类来设置Spring Security和OAuth 2.0:
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.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeRequests(authorize -> authorize .antMatchers("/login").permitAll() .anyRequest().authenticated() ) .oauth2Login(oauth2 -> oauth2 .loginPage("/login") ); return http.build(); } }
3. 创建客户端应用
创建一个简单的客户端应用程序,集成OAuth 2.0客户端:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication public class SsoApplication { public static void main(String[] args) { SpringApplication.run(SsoApplication.class, args); } @Autowired private ClientRegistrationRepository clientRegistrationRepository; @Autowired private OAuth2AuthorizedClientRepository authorizedClientRepository; @GetMapping("/login") public String login() { return "Login"; } @GetMapping("/profile") public String profile(String accessToken) { return "Hello, " + getUsername(accessToken); } private String getUsername(String accessToken) { // 这里可以通过OAuth 2.0客户端库获取用户信息 return "John Doe"; } }
4. 配置OAuth 2.0客户端
在application.yml
文件中配置OAuth 2.0客户端:
spring: security: oauth2: client: registration: google: client-id: YOUR_GOOGLE_CLIENT_ID client-secret: YOUR_GOOGLE_CLIENT_SECRET authorization-grant-type: authorization_code redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}" provider: google: issuer-uri: https://accounts.google.com/o/oauth2/v2/auth token-uri: https://accounts.google.com/o/oauth2/v4/token
5. 运行应用程序
启动应用程序后,访问/login
页面进行登录,然后通过/profile
页面获取认证后的用户信息。
这个示例展示了如何使用Spring Security和OAuth 2.0实现简单的单点登录。实际应用中,你可能需要根据具体需求进行调整和扩展。