本项目演示了如何利用Spring Boot与Spring Security OAuth2技术框架,构建一个能够通过GitHub进行用户身份验证和授权的简易网站。
本段落介绍了如何使用Spring Boot集成Spring Security的OAuth2实现GitHub登录网站的方法。
在实际项目开发过程中,可以利用Spring Security所提供的OAuth2功能来简化第三方登录流程。对于已经采用Spring Security进行权限管理的应用(如YIIU),直接添加第三方登录支持会更加便捷。
为了完成上述目标,首先需要引入如下依赖:
```xml
org.springframework.security.oauth
spring-security-oauth2
```
接着进行相关配置设置。在`application.properties`或对应的YAML文件中添加以下内容:
```properties
security:
oauth2:
client:
client-id: [GitHub应用的Client ID]
client-secret: [GitHub应用的Secret Key]
accessTokenUri: https://github.com/login/oauth/access_token
userAuthorizationUri: https://github.com/login/oauth/authorize
clientAuthenticationScheme: form
registered-redirect-uri: ${site.baseUrl}github_login
resource:
userInfoUri: https://api.github.com/user
```
在Spring Boot应用的主类上添加`@EnableOAuth2Sso`注解,这将简化整个集成过程。需要注意的是,在GitHub中申请的应用回调地址需与配置文件中的registered-redirect-uri保持一致。
启用该特性后,默认情况下原有的登录路径会被覆盖为OAuth2登录页面。可以通过设置属性`security.oauth2.sso.login-path`来更改这一默认行为。一旦用户通过认证,他们的信息将被保存在内存(类似于session)中;因此,在实际应用过程中需要将其持久化到数据库,并且可以与本地账户关联起来。
为了实现上述功能,只需创建一个实现了PrincipalExtractor接口的bean:
```java
@Bean
public PrincipalExtractor principalExtractor() {
return map -> {
String login = map.get(login).toString();
GithubUser githubUser = githubUserService.findByLogin(login);
User user;
if (githubUser == null) {
githubUser = new GithubUser();
// 将GitHub返回的数据映射到本地模型
githubUser = githubUserService.convert(map, githubUser);
// 创建一个新的用户记录,如果该用户名尚未存在的话。
user = userService.findByUsername(login);
if (user == null) {
user = new User();
user.setUsername(login);
// 生成一个随机密码并加密
String randomPassword = StrUtil.randomString(16));
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
user.setPassword(encoder.encode(randomPassword));
userService.save(user);
} else {
// 如果用户已存在,则更新其GitHub ID和其他属性。
user.setUsername(login + _ + githubUser.getGithubId());
...
}
}
return user;
}
```
总之,本段落提供了一个实用的示例来说明如何使用Spring Boot和Spring Security OAuth2实现第三方登录功能。