前文:Spring Security OAuth2——自定义OAuth2第三方登录(Gitee)
Maven
主要
<!--Spring Security-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--Spring Security OAuth2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
解决方案
实体类
org.springframework.security.core.userdetails.UserDetailsService
/**
* 服务实现类
*
* @author ShenTuZhiGang
* @version 1.0.0
* @date 2021-02-15 15:05
*/
@Service
public class UserServiceImpl implements UserDetailsService {
private final UserMapper userMapper;
private final UserRoleMapper userRoleMapper;
public UserServiceImpl(UserMapper userMapper, UserRoleMapper userRoleMapperr) {
this.userMapper = userMapper;
this.userRoleMapper = userRoleMapper;
}
/**
* 加载指定用户
* @param username 用户名
* @return Spring Security UserDetails
* @throws UsernameNotFoundException 用户不存在
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userMapper.selectUserByUserName(username);
if(user == null){
throw new UsernameNotFoundException("账号不存在");
}
UsernamePasswordAuthenticationUser authenticationUser = new UsernamePasswordAuthenticationUser();
BeanUtils.copyProperties(user,authenticationUser);
authenticationUser.setRoles(userRoleMapper.listRoleByUid(user.getId()));
return authenticationUser;
}
}
org.springframework.security.oauth2.client.userinfo.OAuth2UserService
/**
* @author ShenTuZhiGang
* @version 1.0.0
* @date 2021-03-16 02:13
*/
@Service
public class CustomOAuth2UserService extends CustomUserTypesOAuth2UserService {
@Autowired
private IUserService iUserService;
@Autowired
private IRoleService iRoleService;
public CustomOAuth2UserService(Map<String, Class<? extends OAuth2User>> customUserTypes) {
super(customUserTypes);
}
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
OAuth2User oauth2User = super.loadUser(userRequest);
User user = iUserService.getById(1);
if(user == null){
user = iUserService.registerUser(oauth2User.getName(),"");
}
OAuth2AuthenticationUser authenticationUser = new OAuth2AuthenticationUser();
BeanUtils.copyProperties(user,authenticationUser);
authenticationUser.setSource(oauth2User);
authenticationUser.setRoles(iRoleService.listRoleByUid(user.getId()));
return authenticationUser;
}
}
配置
/**
* @author ShenTuZhiGang
* @version 1.0.0
* @date 2021-03-16 02:27
*/
@Configuration
public class CustomOAuth2Config {
@Bean
public Map<String, Class<? extends OAuth2User>> customOAuth2UserTypes(){
Map<String, Class<? extends OAuth2User>> map = new HashMap<>();
map.put("github", GithubOAuth2User.class);
map.put("gitee", GiteeOAuth2User.class);
return map;
}
}
WebSecurityConfigurerAdapter
@Override
protected void configure(HttpSecurity http)throws Exception{
// OAuth2登录
http.oauth2Login()
.redirectionEndpoint()
.baseUri("/login/oauth2/code/*")
.and()
.userInfoEndpoint()
.customUserType(GiteeOAuth2User.class,"gitee")
.and()
.permitAll()
}
application.yml
spring:
# Security Config
security:
oauth2:
client:
registration:
gitee:
provider: gitee
client-id: {mm}
client-secret: {mm}
authorization-grant-type: authorization_code
redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
scope: user_info
client-name: Gitee
client-alias: gitee
provider:
gitee:
authorization-uri: https://gitee.com/oauth/authorize
token-uri: https://gitee.com/oauth/token
user-name-attribute: id
user-info-uri: https://gitee.com/api/v5/user
参考文章