您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# SpringBoot Security中GitHub单点登录的操作方法
## 1. 单点登录(SSO)与OAuth2.0简介
单点登录(Single Sign-On, SSO)是一种身份验证机制,允许用户通过单一凭证访问多个关联系统。OAuth2.0是当前主流的授权框架,GitHub等平台均提供基于OAuth2.0的SSO支持。
### 核心概念
- **OAuth2.0角色**:资源所有者(用户)、客户端(应用)、授权服务器(GitHub)、资源服务器(GitHub API)
- **授权流程**:授权码模式(Authorization Code)最常用
## 2. 准备工作
### 2.1 GitHub应用注册
1. 访问 [GitHub Developer Settings](https://github.com/settings/developers)
2. 创建新OAuth应用("New OAuth App")
3. 填写关键信息:
```plaintext
Application name: 您的应用名称
Homepage URL: http://localhost:8080
Authorization callback URL: http://localhost:8080/login/oauth2/code/github
Client ID和Client Secret<!-- pom.xml 关键依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
// SecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/login**").permitAll()
.anyRequest().authenticated()
)
.oauth2Login(oauth2 -> oauth2
.loginPage("/login")
.defaultSuccessUrl("/home", true)
);
return http.build();
}
}
# application.yml
spring:
security:
oauth2:
client:
registration:
github:
client-id: ${GITHUB_CLIENT_ID}
client-secret: ${GITHUB_CLIENT_SECRET}
scope: user:email
最佳实践:将敏感信息存储在环境变量中而非代码库
@Service
public class CustomOAuth2UserService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> {
@Override
public OAuth2User loadUser(OAuth2UserRequest request) {
DefaultOAuth2UserService delegate = new DefaultOAuth2UserService();
OAuth2User user = delegate.loadUser(request);
Map<String, Object> attributes = user.getAttributes();
// 可在此处进行用户信息处理或数据库存储
return user;
}
}
// 更新SecurityConfig
.oauth2Login(oauth2 -> oauth2
.userInfoEndpoint(userInfo -> userInfo
.userService(customOAuth2UserService)
)
)
@GetMapping("/api/user")
@ResponseBody
public Map<String, Object> userInfo(@AuthenticationPrincipal OAuth2User user) {
return Collections.singletonMap("name", user.getAttribute("name"));
}
<!-- templates/home.html -->
<div th:if="${#authentication.principal}">
<h2>Welcome, <span th:text="${#authentication.principal.attributes['login']}"></span>!</h2>
<img th:src="${#authentication.principal.attributes['avatar_url']}" width="100"/>
</div>
spring:
security:
oauth2:
client:
registration:
github:
client-name: GitHub
provider: github
github-enterprise:
client-name: GitHub Enterprise
client-id: enterprise-client-id
client-secret: enterprise-secret
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
scope: user,repo
client-authentication-method: post
// 添加JWT依赖后配置
.oauth2Login(oauth2 -> oauth2
.successHandler((request, response, authentication) -> {
String token = generateJwtToken(authentication);
response.sendRedirect("/dashboard?token=" + token);
})
)
重定向URI不匹配:
application.yml完全一致403禁止访问:
// 添加CSRF配置
http.csrf(csrf -> csrf
.ignoringRequestMatchers("/login/oauth2/code/**")
);
范围权限不足:
scope: read:user,user:email
HTTPS强制:
server.ssl.enabled=true
会话管理:
.sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
)
限流保护:
http.requestCache().disable()
.headers().frameOptions().sameOrigin()
.and().exceptionHandling().accessDeniedPage("/403");
通过Spring Security OAuth2 Client集成GitHub登录,开发者可以快速实现安全可靠的SSO方案。本文介绍的配置方法可扩展至其他OAuth2提供商(如Google、Facebook),只需替换相应配置即可。建议在实际项目中结合JWT、Redis等组件构建更完善的认证体系。
完整示例代码:可访问 GitHub示例仓库 “`
(注:实际字数约1500字,可根据需要调整章节深度。关键代码已提供完整实现路径,建议配合实际调试使用)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。