Skip to content

Commit 99b7dc9

Browse files
optimize: 优化 GitHubOAuth2LoginAuthenticationProvider
1 parent f6ae96d commit 99b7dc9

2 files changed

Lines changed: 69 additions & 50 deletions

File tree

src/main/java/com/spring/security/authentication/handler/auth/LoginSuccessHandler.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.security.web.authentication.AbstractAuthenticationTargetUrlRequestHandler;
2525
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
2626
import org.springframework.stereotype.Component;
27+
import tools.jackson.core.type.TypeReference;
2728
import tools.jackson.databind.json.JsonMapper;
2829

2930
/**
@@ -59,10 +60,8 @@ public void onAuthenticationSuccess(
5960
JwtTokenUserLoginInfo jwtTokenUserLoginInfo =
6061
new JwtTokenUserLoginInfo(currentUser.getSessionId(), currentUser.getUsername());
6162
// 一些特殊的登录参数。比如三方登录,需要额外返回一个字段是否需要跳转的绑定已有账号页面
62-
@SuppressWarnings("unchecked")
6363
Map<String, Object> additionalInfo = Optional.ofNullable(authentication.getDetails())
64-
.filter(Map.class::isInstance)
65-
.map(Map.class::cast)
64+
.map(details -> jsonMapper.convertValue(details, new TypeReference<Map<String, Object>>() {}))
6665
.orElse(Map.of());
6766
boolean hasAccount =
6867
authentication.getDetails() == null || Boolean.FALSE.equals(additionalInfo.get("isNewUser"));

src/main/java/com/spring/security/authentication/handler/auth/github/login/GitHubOAuth2LoginAuthenticationProvider.java

Lines changed: 67 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -93,35 +93,41 @@ public Authentication authenticate(@NonNull Authentication authentication) throw
9393
Long providerUserId = extractProviderUserId(oauth2User);
9494

9595
// 查询用户信息
96-
User user = retrieveUser(providerUserId, oauth2User, authorizationCodeAuthenticationToken);
97-
UserLoginInfo userLoginInfo = new UserLoginInfo(
98-
UUID.randomUUID().toString(),
99-
user != null ? user.getId() : null,
100-
user != null ? user.getUsername() : oauth2User.getAttribute("login"),
101-
user != null ? user.getPassword() : null,
102-
user != null ? user.getPhone() : null,
103-
user != null ? user.getEmail() : oauth2User.getAttribute("email"),
104-
user != null ? user.getAccountNonLocked() : null,
105-
user != null ? user.getAccountNonExpired() : null,
106-
user != null ? user.getCredentialsNonExpired() : null,
107-
user != null ? user.getEnabled() : null,
108-
user != null ? user.getMfaSecret() : null,
109-
user != null ? user.getMfaEnabled() : null,
110-
user != null ? mappedAuthorities : null);
96+
User loadedUser = retrieveUser(providerUserId);
11197

11298
// 认证通过,使用 Authenticated 为 true 的构造函数
99+
// 验证用户信息
100+
// 构造成功结果
113101
GitHubOAuth2LoginAuthenticationToken result = new GitHubOAuth2LoginAuthenticationToken(
114102
loginAuthenticationToken.getClientRegistration(),
115103
loginAuthenticationToken.getAuthorizationExchange(),
116-
userLoginInfo,
104+
Optional.ofNullable(loadedUser)
105+
.map(user -> new UserLoginInfo(
106+
UUID.randomUUID().toString(),
107+
user.getId(),
108+
user.getUsername(),
109+
user.getPassword(),
110+
user.getPhone(),
111+
user.getEmail(),
112+
user.getAccountNonLocked(),
113+
user.getAccountNonExpired(),
114+
user.getCredentialsNonExpired(),
115+
user.getEnabled(),
116+
user.getMfaSecret(),
117+
user.getMfaEnabled(),
118+
authorities))
119+
.orElse(null),
117120
mappedAuthorities,
118-
loginAuthenticationToken.getAccessToken(),
119-
loginAuthenticationToken.getRefreshToken());
120-
// 必须转化成Map
121-
result.setDetails(jsonMapper.convertValue(authentication.getDetails(), Map.class));
122-
log.debug("用户名认证成功,用户: {}", userLoginInfo.getUsername());
123-
// 验证用户信息
124-
// 构造成功结果
121+
authorizationCodeAuthenticationToken.getAccessToken(),
122+
authorizationCodeAuthenticationToken.getRefreshToken());
123+
result.setDetails(new GitHubOAuth2Meta(
124+
UserIdentity.Provider.GITHUB,
125+
providerUserId,
126+
oauth2User.getAttribute("login"),
127+
oauth2User.getAttribute("name"),
128+
oauth2User.getAttribute("email"),
129+
loadedUser == null ? Boolean.TRUE : Boolean.FALSE));
130+
log.debug("用户名认证成功,用户: {}", Optional.ofNullable(oauth2User.getAttribute("login")));
125131
return result;
126132
}
127133

@@ -143,34 +149,48 @@ public final void setAuthoritiesMapper(GrantedAuthoritiesMapper authoritiesMappe
143149
public boolean supports(@NonNull Class<?> authentication) {
144150
return GitHubOAuth2LoginAuthenticationToken.class.isAssignableFrom(authentication);
145151
}
146-
147-
protected User retrieveUser(
148-
Long providerUserId, OAuth2User oauth2User, GitHubOAuth2AuthorizationCodeAuthenticationToken authentication)
149-
throws AuthenticationException {
152+
// protected Authentication createSuccessAuthentication(
153+
// Authentication authentication, User loadedUser, Collection<GrantedAuthority> mappedAuthorities) {
154+
// GitHubOAuth2AuthorizationCodeAuthenticationToken authorizationCodeAuthenticationToken =
155+
// (GitHubOAuth2AuthorizationCodeAuthenticationToken) authentication;
156+
// GitHubOAuth2LoginAuthenticationToken result = new GitHubOAuth2LoginAuthenticationToken(
157+
// authorizationCodeAuthenticationToken.getClientRegistration(),
158+
// authorizationCodeAuthenticationToken.getAuthorizationExchange(),
159+
// Optional.ofNullable(loadedUser)
160+
// .map(user -> new UserLoginInfo(
161+
// UUID.randomUUID().toString(),
162+
// user.getId(),
163+
// user.getUsername(),
164+
// user.getPassword(),
165+
// user.getPhone(),
166+
// user.getEmail(),
167+
// user.getAccountNonLocked(),
168+
// user.getAccountNonExpired(),
169+
// user.getCredentialsNonExpired(),
170+
// user.getEnabled(),
171+
// user.getMfaSecret(),
172+
// user.getMfaEnabled(),
173+
// authorities))
174+
// .orElse(null),
175+
// mappedAuthorities,
176+
// authorizationCodeAuthenticationToken.getAccessToken(),
177+
// authorizationCodeAuthenticationToken.getRefreshToken());
178+
// result.setDetails(new GitHubOAuth2Meta(
179+
// UserIdentity.Provider.GITHUB,
180+
// providerUserId,
181+
// oauth2User.getAttribute("login"),
182+
// oauth2User.getAttribute("name"),
183+
// oauth2User.getAttribute("email"),
184+
// loadedUser == null ? Boolean.TRUE:Boolean.FALSE));
185+
// log.debug("用户名认证成功,用户: {}", Optional.ofNullable(oauth2User.getAttribute("login")));
186+
// return result;
187+
// }
188+
protected User retrieveUser(Long providerUserId) throws AuthenticationException {
150189
log.debug("查询GitHub用户: providerUserId={}", providerUserId);
151190
return userIdentityRepository
152191
.findByProviderUserIdAndProvider(providerUserId, UserIdentity.Provider.GITHUB)
153192
.map(UserIdentity::getUserId)
154193
.flatMap(userRepository::findById)
155-
.map(user -> {
156-
authentication.setDetails(new GitHubOAuth2Meta(
157-
UserIdentity.Provider.GITHUB,
158-
providerUserId,
159-
oauth2User.getAttribute("login"),
160-
oauth2User.getAttribute("name"),
161-
oauth2User.getAttribute("email"),
162-
Boolean.FALSE));
163-
return user;
164-
})
165-
.orElseGet(() -> {
166-
authentication.setDetails(new GitHubOAuth2Meta(
167-
UserIdentity.Provider.GITHUB,
168-
providerUserId,
169-
oauth2User.getAttribute("login"),
170-
oauth2User.getAttribute("name"),
171-
oauth2User.getAttribute("email"),
172-
Boolean.TRUE));
173-
return null;
174-
});
194+
.orElse(null);
175195
}
176196
}

0 commit comments

Comments
 (0)