cl
2024-01-22 8de0bed14d364e3d3adae6b6e2260b838d180c23
提交 | 用户 | 时间
71e81e 1 package cn.stylefeng.guns.oauth2.service.impl;
2
3 import cn.stylefeng.guns.base.auth.service.AuthService;
4 import cn.stylefeng.guns.base.oauth2.service.OauthUserInfoService;
5 import cn.stylefeng.guns.oauth2.service.LoginService;
6 import cn.stylefeng.guns.sys.core.exception.oauth.OAuthExceptionEnum;
7 import cn.stylefeng.guns.sys.core.exception.oauth.OAuthLoginException;
8 import cn.stylefeng.guns.sys.modular.system.entity.User;
9 import cn.stylefeng.guns.sys.modular.system.service.UserService;
10 import cn.stylefeng.guns.base.oauth2.entity.OauthUserInfo;
11 import cn.stylefeng.guns.oauth2.factory.OAuthUserInfoFactory;
12 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
13 import me.zhyd.oauth.model.AuthUser;
14 import org.springframework.beans.factory.annotation.Autowired;
15 import org.springframework.stereotype.Service;
16 import org.springframework.transaction.annotation.Transactional;
17
18 import java.util.List;
19
20 /**
21  * 默认第三方登录逻辑
22  *
23  * @author fengshuonan
24  * @Date 2019/6/9 18:16
25  */
26 @Service
27 public class DefaultLoginService implements LoginService {
28
29     @Autowired
30     private UserService userService;
31
32     @Autowired
33     private OauthUserInfoService oauthUserInfoService;
34
35     @Autowired
36     private AuthService authService;
37
38     @Override
39     @Transactional(rollbackFor = Exception.class)
40     public String oauthLogin(AuthUser oauthUser) {
41
42         if (oauthUser == null) {
43             throw new OAuthLoginException(OAuthExceptionEnum.OAUTH_RESPONSE_ERROR);
44         }
45
46         //当前无登录用户,创建用户或根据已有绑定用户的账号登录
47         String account = getOauthUserAccount(oauthUser);
48
49         //执行原有系统登录逻辑
50         return authService.login(account);
51     }
52
53
54     /**
55      * 绑定当前用户的source和openId
56      *
57      * @author fengshuonan
58      * @Date 2019/6/9 18:51
59      */
60     private void bindOAuthUser(Long userId, AuthUser oauthUser) {
61
62         //先判断当前系统这个openId有没有人用
63         QueryWrapper<OauthUserInfo> queryWrapper = new QueryWrapper<OauthUserInfo>()
64                 .eq("source", oauthUser.getSource().name())
65                 .and(i -> i.eq("uuid", oauthUser.getUuid()))
66                 .and(i -> i.ne("user_id", userId));
67         List<OauthUserInfo> oauthUserInfos = this.oauthUserInfoService.list(queryWrapper);
68
69         //已有人绑定,抛出异常
70         if (oauthUserInfos != null && oauthUserInfos.size() > 0) {
71             throw new OAuthLoginException(OAuthExceptionEnum.OPEN_ID_ALREADY_BIND);
72         } else {
73             //新建一条绑定记录
74             OauthUserInfo oAuthUserInfo = OAuthUserInfoFactory.createOAuthUserInfo(userId, oauthUser);
75             this.oauthUserInfoService.save(oAuthUserInfo);
76         }
77
78     }
79
80     /**
81      * 通过第三方登录的信息创建本系统用户
82      *
83      * @author fengshuonan
84      * @Date 2019/6/9 19:07
85      */
86     private String getOauthUserAccount(AuthUser oauthUser) {
87
88         //先判断当前系统这个openId有没有人用
89         QueryWrapper<OauthUserInfo> queryWrapper = new QueryWrapper<OauthUserInfo>()
90                 .eq("source", oauthUser.getSource().name())
91                 .and(i -> i.eq("uuid", oauthUser.getUuid()));
92         OauthUserInfo oauthUserInfos = this.oauthUserInfoService.getOne(queryWrapper);
93
94         //已有人绑定,直接返回这个人的账号,进行登录
95         if (oauthUserInfos != null) {
96             Long userId = oauthUserInfos.getUserId();
97             return this.userService.getById(userId).getAccount();
98         } else {
99
100             //没有人绑定的创建这个人的本系统用户
101             User user = OAuthUserInfoFactory.createOAuthUser(oauthUser);
102             this.userService.save(user);
103
104             //新建一条oauth2绑定记录
105             OauthUserInfo oAuthUserInfo = OAuthUserInfoFactory.createOAuthUserInfo(user.getUserId(), oauthUser);
106             this.oauthUserInfoService.save(oAuthUserInfo);
107
108             return user.getAccount();
109         }
110     }
111
112 }