1
zj
2024-08-12 11bb86a81c99672e5e51ca7289f49a57346739e8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
package systemuser.internal;
 
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.springframework.security.providers.encoding.PasswordEncoder;
import org.springframework.util.ObjectUtils;
 
import kernel.exception.BusinessException;
import kernel.util.StringUtils;
import kernel.web.ApplicationUtil;
import kernel.web.Page;
import project.Constants;
import project.log.Log;
import project.log.LogService;
import project.user.googleauth.GoogleAuthService;
import security.Role;
import security.RoleService;
import security.SecUser;
import security.internal.SecUserService;
import security.internal.SecUserServiceImpl;
import systemuser.AdminSystemUserService;
 
public class AdminSystemUserServiceImpl implements AdminSystemUserService {
    
    private RoleService roleService;
    
    protected LogService logService;
    
    private SecUserService secUserService;
    
    private PasswordEncoder passwordEncoder;
    
    private GoogleAuthService googleAuthService;
    
    public void save(SecUser user,String operatorUsername,String loginSafeword,String code,String ip,String superGoogleAuthCode) {
        googleAuthService.checkSuperGoogleAuthCode(superGoogleAuthCode);
        String enable = user.getEnabled()?"开启":"未开启";
        
        checkLoginSafeword(operatorUsername,loginSafeword);
        
        saveLog(user,operatorUsername,"ip:"+ip+"管理员新增系统用户,角色为["+user.getId()+"],登录权限为["+enable+"],邮箱为["+user.getEmail()+"],验证码:["+code+"]");
        user.setSafeword(passwordEncoder.encodePassword(user.getSafeword(), user.getUsername()));
        
        secUserService.saveUser(user);
    }
    
    public SecUser get(Serializable id) {
        return secUserService.findUserById(id);
    }
    
    /**
     * 验证登录人资金密码
     * @param operatorUsername
     * @param loginSafeword
     */
    private void checkLoginSafeword(String operatorUsername,String loginSafeword) {
        SecUser sec = this.secUserService.findUserByLoginName(operatorUsername);
        String sysSafeword = sec.getSafeword();
        String safeword_md5 = passwordEncoder.encodePassword(loginSafeword, operatorUsername);
        if (!safeword_md5.equals(sysSafeword)) throw new BusinessException("登录人资金密码错误");
    }
    
    public void saveLog(SecUser secUser, String operator,String context) {
        Log log = new Log();
        log.setCategory(Constants.LOG_CATEGORY_OPERATION);
        log.setOperator(operator);
        log.setUsername(secUser.getUsername());
        log.setPartyId(secUser.getPartyId());
        log.setLog(context);
        log.setCreateTime(new Date());
        logService.saveSync(log);
    }
    
    /**
     * 更新系统用户,有密码则更新密码,否则更新用户
     * @param user
     * @param newPassword
     * @param type 密码类型,password:登录密码,safe_password:资金密码
     */
    public void update(SecUser user,String newPassword,String type,String operatorUsername,String loginSafeword,String code,String ip,String superGoogleAuthCode) {
        if(ObjectUtils.isEmpty(newPassword)) {
            checkLoginSafeword(operatorUsername,loginSafeword);
            SecUser userDB = get(user.getId());
            String enableDB = userDB.getEnabled()?"开启":"未开启";
            
            String emailDB = user.getEmail();
            this.secUserService.update(user);
            String enable = user.getEnabled()?"开启":"未开启";
            
            saveLog(user,operatorUsername,"ip:"+ip+"管理员修改系统用户,修改前角色为["+userDB.getRoles().toArray(new Role[0])[0].getRoleName()+"],登录权限["+enableDB+"],邮箱为["+emailDB+"],"
                    + "修改后角色为["+user.getRoles().toArray(new Role[0])[0].getRoleName()+"],登录权限["+enable+"],邮箱为["+user.getEmail()+"]");
        }else {
            googleAuthService.checkSuperGoogleAuthCode(superGoogleAuthCode);
            checkLoginSafeword(operatorUsername,loginSafeword);
            switch(type) {
                case "password":
                    secUserService.updatePassword(user.getUsername(), newPassword);
                    saveLog(user,operatorUsername,"ip:"+ip+"管理员修改系统用户登录密码,验证码:["+code+"]");
                    break;
                case "safe_password":
                    secUserService.updateSafeword(user.getUsername(), newPassword);
                    saveLog(user,operatorUsername,"ip:"+ip+"管理员修改系统用户资金密码,验证码:["+code+"]");
                    break;
                default:
                    break;
            }
        }
    }
    
    /**
     * 删除系统用户
     */
    public void delete(SecUser user, String operatorUsername, String loginSafeword, String ip, String superGoogleAuthCode) {
        googleAuthService.checkSuperGoogleAuthCode(superGoogleAuthCode);
        
        this.checkLoginSafeword(operatorUsername, loginSafeword);
        
        SecUser userDB = get(user.getId());
        String enableDB = userDB.getEnabled()?"开启":"未开启";
        String emailDB = user.getEmail();
        
        secUserService.deleteUser(user);
        saveLog(user, operatorUsername, "ip:"+ip+"管理员删除系统用户,系统用户角色为["+userDB.getRoles().toArray(new Role[0])[0].getRoleName()+"],登录权限["+enableDB+"],邮箱为["+emailDB+"]");
    }
    
    public Page pagedQuery(int pageNo,int pageSize ,String usernamePara) {
        if (pageNo <= 0) pageNo = 1;
        Page page = new Page(pageNo,pageSize,Integer.MAX_VALUE);
        
        ArrayList<Object> whereParams=new ArrayList<Object>();
        StringBuilder whereStatement=new StringBuilder("WHERE (PARTY_UUID IS NULL OR PARTY_UUID='') AND UUID NOT IN('SROOT') ");
        if(StringUtils.isNotEmpty(usernamePara)) {
            whereStatement.append("AND USERNAME LIKE ? ");
            whereParams.add("%"+usernamePara+"%");
        }
        
        whereStatement.append("ORDER BY CREATETIME ASC LIMIT ?,?");
        whereParams.add(page.getFirstElementNumber());
        whereParams.add(pageSize);
        
        List<SecUser> secuserList=ApplicationUtil.executeSelect(SecUser.class, whereStatement.toString(), whereParams.toArray(new Object[whereParams.size()]));
        secuserList.forEach(secuser->SecUserServiceImpl.bindRoleResource(secuser));
        page.setElements(secuserList);
        
        return page;
    }
    
    public Map<String,String> findRoleMap() {
        Map<String,String> map = new HashMap<>();
        List<Role> all = roleService.getAll();
        for(Role role:all) {
            String roleName=role.getRoleName();
            if(Constants.ROLE_MAP.containsKey(roleName)) continue;
            map.put(roleName,roleName);
        }
        
        return map;
    }
    
    public void setRoleService(RoleService roleService) {
        this.roleService = roleService;
    }
    public SecUserService getSecUserService() {
        return secUserService;
    }
 
    public void setSecUserService(SecUserService secUserService) {
        this.secUserService = secUserService;
    }
 
    public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
        this.passwordEncoder = passwordEncoder;
    }
    
    public void setLogService(LogService logService) {
        this.logService = logService;
    }
    
    public void setGoogleAuthService(GoogleAuthService googleAuthService) {
        this.googleAuthService = googleAuthService;
    }
}