2
0

UserInfoService.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. /*
  2. * Copyright [2020] [MaxKey of copyright http://www.maxkey.top]
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package org.maxkey.persistence.service;
  17. import java.sql.Types;
  18. import org.apache.mybatis.jpa.persistence.JpaBaseService;
  19. import org.maxkey.constants.ConstsStatus;
  20. import org.maxkey.crypto.password.PasswordReciprocal;
  21. import org.maxkey.entity.Accounts;
  22. import org.maxkey.entity.ChangePassword;
  23. import org.maxkey.entity.UserInfo;
  24. import org.maxkey.persistence.mapper.UserInfoMapper;
  25. import org.maxkey.persistence.mq.MqIdentityAction;
  26. import org.maxkey.persistence.mq.MqIdentityTopic;
  27. import org.maxkey.persistence.mq.MqPersistService;
  28. import org.maxkey.persistence.repository.PasswordPolicyValidator;
  29. import org.maxkey.util.DateUtils;
  30. import org.maxkey.util.StringUtils;
  31. import org.maxkey.web.WebContext;
  32. import org.slf4j.Logger;
  33. import org.slf4j.LoggerFactory;
  34. import org.springframework.beans.factory.annotation.Autowired;
  35. import org.springframework.jdbc.core.JdbcTemplate;
  36. import org.springframework.security.crypto.password.PasswordEncoder;
  37. import org.springframework.stereotype.Repository;
  38. /**
  39. * @author Crystal.Sea
  40. *
  41. */
  42. @Repository
  43. public class UserInfoService extends JpaBaseService<UserInfo> {
  44. final static Logger _logger = LoggerFactory.getLogger(UserInfoService.class);
  45. @Autowired
  46. private PasswordEncoder passwordEncoder;
  47. @Autowired
  48. PasswordPolicyValidator passwordPolicyValidator;
  49. @Autowired
  50. MqPersistService mqPersistService;
  51. @Autowired
  52. protected JdbcTemplate jdbcTemplate;
  53. AccountsService accountsService;
  54. public UserInfoService() {
  55. super(UserInfoMapper.class);
  56. }
  57. /* (non-Javadoc)
  58. * @see com.connsec.db.service.BaseService#getMapper()
  59. */
  60. @Override
  61. public UserInfoMapper getMapper() {
  62. return (UserInfoMapper)super.getMapper();
  63. }
  64. public boolean insert(UserInfo userInfo) {
  65. userInfo = passwordEncoder(userInfo);
  66. if (super.insert(userInfo)) {
  67. if(mqPersistService.getApplicationConfig().isMessageQueueSupport()) {
  68. UserInfo loadUserInfo = findUserRelated(userInfo.getId());
  69. mqPersistService.send(
  70. MqIdentityTopic.USERINFO_TOPIC,
  71. loadUserInfo,
  72. MqIdentityAction.CREATE_ACTION);
  73. }
  74. return true;
  75. }
  76. return false;
  77. }
  78. public boolean update(UserInfo userInfo) {
  79. userInfo = passwordEncoder(userInfo);
  80. if (super.update(userInfo)) {
  81. if(mqPersistService.getApplicationConfig().isMessageQueueSupport()) {
  82. UserInfo loadUserInfo = findUserRelated(userInfo.getId());
  83. accountUpdate(loadUserInfo);
  84. mqPersistService.send(
  85. MqIdentityTopic.USERINFO_TOPIC,
  86. loadUserInfo,
  87. MqIdentityAction.UPDATE_ACTION);
  88. }
  89. changePasswordProvisioning(userInfo);
  90. return true;
  91. }
  92. return false;
  93. }
  94. public boolean delete(UserInfo userInfo) {
  95. UserInfo loadUserInfo = null;
  96. if(mqPersistService.getApplicationConfig().isMessageQueueSupport()) {
  97. loadUserInfo = findUserRelated(userInfo.getId());
  98. }
  99. if( super.delete(userInfo)){
  100. mqPersistService.send(
  101. MqIdentityTopic.USERINFO_TOPIC,
  102. loadUserInfo,
  103. MqIdentityAction.DELETE_ACTION);
  104. accountUpdate(loadUserInfo);
  105. return true;
  106. }
  107. return false;
  108. }
  109. //更新账号状态
  110. public void accountUpdate(UserInfo userInfo) {
  111. if(userInfo.getStatus() != ConstsStatus.ACTIVE) {
  112. if(accountsService==null) {
  113. accountsService =
  114. WebContext.getBean("accountsService",AccountsService.class);
  115. }
  116. Accounts queryAcount =new Accounts();
  117. queryAcount.setUserId(userInfo.getId());
  118. for (Accounts acount : accountsService.query(queryAcount)) {
  119. acount.setStatus(ConstsStatus.INACTIVE);
  120. accountsService.update(acount);
  121. }
  122. }
  123. }
  124. public UserInfo findUserRelated(String userId) {
  125. UserInfo loadUserInfo =this.get(userId);
  126. loadUserInfo.setDepts(getMapper().findDeptsByUserId(userId));
  127. loadUserInfo.setAdjoints(getMapper().findAdjointsByUserId(userId));
  128. return loadUserInfo;
  129. }
  130. public boolean updateGridList(String gridList) {
  131. try {
  132. if (gridList != null && !gridList.equals("")) {
  133. WebContext.getUserInfo().setGridList(Integer.parseInt(gridList));
  134. getMapper().updateGridList(WebContext.getUserInfo());
  135. }
  136. }catch(Exception e) {
  137. e.printStackTrace();
  138. return false;
  139. }
  140. return true;
  141. }
  142. public void saveOrUpdate(UserInfo userInfo) {
  143. if(findOne(" username = ? and instid = ?",
  144. new Object[] { userInfo.getUsername(),userInfo.getInstId() },
  145. new int[] { Types.VARCHAR,Types.VARCHAR}) == null) {
  146. insert(userInfo);
  147. }else {
  148. userInfo.setPassword(null);
  149. update(userInfo);
  150. }
  151. }
  152. public boolean updateProtectedApps(UserInfo userinfo) {
  153. try {
  154. if(WebContext.getUserInfo() != null) {
  155. userinfo.setModifiedBy(WebContext.getUserInfo().getId());
  156. }
  157. userinfo.setModifiedDate(DateUtils.getCurrentDateTimeAsString());
  158. return getMapper().updateProtectedApps(userinfo) > 0;
  159. } catch (Exception e) {
  160. e.printStackTrace();
  161. }
  162. return false;
  163. }
  164. public UserInfo findByUsername(String username) {
  165. return getMapper().findByUsername(username);
  166. }
  167. public UserInfo findByEmailMobile(String emailMobile) {
  168. return getMapper().findByEmailMobile(emailMobile);
  169. }
  170. public UserInfo findByAppIdAndUsername(String appId,String username){
  171. try {
  172. UserInfo userinfo = new UserInfo();
  173. userinfo.setUsername(username);
  174. return getMapper().findByAppIdAndUsername(userinfo) ;
  175. } catch (Exception e) {
  176. e.printStackTrace();
  177. }
  178. return null;
  179. }
  180. public UserInfo passwordEncoder(UserInfo userInfo) {
  181. //密码不为空,则需要进行加密处理
  182. if(userInfo.getPassword()!=null && !userInfo.getPassword().equals("")) {
  183. String password = passwordEncoder.encode(userInfo.getPassword());
  184. userInfo.setDecipherable(PasswordReciprocal.getInstance().encode(userInfo.getPassword()));
  185. _logger.debug("decipherable : "+userInfo.getDecipherable());
  186. userInfo.setPassword(password);
  187. userInfo.setPasswordLastSetTime(DateUtils.getCurrentDateTimeAsString());
  188. userInfo.setModifiedDate(DateUtils.getCurrentDateTimeAsString());
  189. }
  190. return userInfo;
  191. }
  192. /**
  193. * 认证密码修改
  194. * @param oldPassword
  195. * @param newPassword
  196. * @param confirmPassword
  197. * @param passwordSetType
  198. * @return
  199. */
  200. public boolean changePassword( String oldPassword,
  201. String newPassword,
  202. String confirmPassword,
  203. int passwordSetType) {
  204. try {
  205. WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT, "");
  206. UserInfo userInfo = WebContext.getUserInfo();
  207. UserInfo changeUserInfo = new UserInfo();
  208. changeUserInfo.setUsername(userInfo.getUsername());
  209. changeUserInfo.setPassword(newPassword);
  210. changeUserInfo.setId(userInfo.getId());
  211. changeUserInfo.setDecipherable(userInfo.getDecipherable());
  212. changeUserInfo.setPasswordSetType(passwordSetType);
  213. if(newPassword.equals(confirmPassword)){
  214. if(oldPassword==null ||
  215. passwordEncoder.matches(oldPassword, userInfo.getPassword())){
  216. if(changePassword(changeUserInfo,true) ){
  217. userInfo.setPassword(changeUserInfo.getPassword());
  218. userInfo.setDecipherable(changeUserInfo.getDecipherable());
  219. return true;
  220. }
  221. return false;
  222. }else {
  223. if(oldPassword!=null &&
  224. passwordEncoder.matches(newPassword, userInfo.getPassword())) {
  225. WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT,
  226. WebContext.getI18nValue("PasswordPolicy.OLD_PASSWORD_MATCH"));
  227. }else {
  228. WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT,
  229. WebContext.getI18nValue("PasswordPolicy.OLD_PASSWORD_NOT_MATCH"));
  230. }
  231. }
  232. }else {
  233. WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT,
  234. WebContext.getI18nValue("PasswordPolicy.CONFIRMPASSWORD_NOT_MATCH"));
  235. }
  236. } catch (Exception e) {
  237. e.printStackTrace();
  238. }
  239. return false;
  240. }
  241. /**
  242. * 后台密码修改
  243. * @param changeUserInfo
  244. * @param passwordPolicy
  245. * @return
  246. */
  247. public boolean changePassword(UserInfo changeUserInfo,boolean passwordPolicy) {
  248. try {
  249. _logger.debug("decipherable old : " + changeUserInfo.getDecipherable());
  250. _logger.debug("decipherable new : " + PasswordReciprocal.getInstance().encode(changeUserInfo.getPassword()));
  251. if (passwordPolicy && passwordPolicyValidator.validator(changeUserInfo) == false) {
  252. return false;
  253. }
  254. if (WebContext.getUserInfo() != null) {
  255. changeUserInfo.setModifiedBy(WebContext.getUserInfo().getId());
  256. }
  257. changeUserInfo = passwordEncoder(changeUserInfo);
  258. if (getMapper().updatePassword(changeUserInfo) > 0) {
  259. changePasswordProvisioning(changeUserInfo);
  260. return true;
  261. }
  262. return false;
  263. } catch (Exception e) {
  264. e.printStackTrace();
  265. }
  266. return false;
  267. }
  268. public String randomPassword() {
  269. return passwordPolicyValidator.generateRandomPassword();
  270. }
  271. public void changePasswordProvisioning(UserInfo userInfo) {
  272. if(StringUtils.isNotBlank(userInfo.getPassword())) {
  273. UserInfo loadUserInfo = findByUsername(userInfo.getUsername());
  274. ChangePassword changePassword=new ChangePassword();
  275. changePassword.setId(loadUserInfo.getId());
  276. changePassword.setUserId(loadUserInfo.getId());
  277. changePassword.setUsername(loadUserInfo.getUsername());
  278. changePassword.setWindowsAccount(loadUserInfo.getWindowsAccount());
  279. changePassword.setMobile(loadUserInfo.getMobile());
  280. changePassword.setEmail(loadUserInfo.getEmail());
  281. changePassword.setEmployeeNumber(loadUserInfo.getEmployeeNumber());
  282. changePassword.setDecipherable(loadUserInfo.getDecipherable());
  283. changePassword.setPassword(loadUserInfo.getPassword());
  284. changePassword.setInstId(loadUserInfo.getInstId());
  285. mqPersistService.send(
  286. MqIdentityTopic.PASSWORD_TOPIC,
  287. changePassword,
  288. MqIdentityAction.PASSWORD_ACTION);
  289. }
  290. }
  291. public boolean updateAppLoginPassword(UserInfo userinfo) {
  292. try {
  293. if(WebContext.getUserInfo() != null) {
  294. userinfo.setModifiedBy(WebContext.getUserInfo().getId());
  295. }
  296. userinfo.setModifiedDate(DateUtils.getCurrentDateTimeAsString());
  297. return getMapper().updateAppLoginPassword(userinfo) > 0;
  298. } catch (Exception e) {
  299. e.printStackTrace();
  300. }
  301. return false;
  302. }
  303. /**
  304. * 锁定用户:islock:1 用户解锁 2 用户锁定
  305. * @param userInfo
  306. */
  307. public void updateLocked(UserInfo userInfo) {
  308. try {
  309. if(userInfo != null && StringUtils.isNotEmpty(userInfo.getId())) {
  310. userInfo.setIsLocked(ConstsStatus.STOP);
  311. getMapper().updateLocked(userInfo);
  312. }
  313. } catch(Exception e) {
  314. e.printStackTrace();
  315. }
  316. }
  317. /**
  318. * 用户登录成功后,重置错误密码次数和解锁用户
  319. * @param userInfo
  320. */
  321. public void updateLockout(UserInfo userInfo) {
  322. try {
  323. if(userInfo != null && StringUtils.isNotEmpty(userInfo.getId())) {
  324. userInfo.setIsLocked(ConstsStatus.START);
  325. userInfo.setBadPasswordCount(0);
  326. getMapper().updateLockout(userInfo);
  327. }
  328. } catch(Exception e) {
  329. e.printStackTrace();
  330. }
  331. }
  332. /**
  333. * 更新错误密码次数
  334. * @param userInfo
  335. */
  336. public void updateBadPasswordCount(UserInfo userInfo) {
  337. try {
  338. if(userInfo != null && StringUtils.isNotEmpty(userInfo.getId())) {
  339. int updateBadPWDCount = userInfo.getBadPasswordCount() + 1;
  340. userInfo.setBadPasswordCount(updateBadPWDCount);
  341. getMapper().updateBadPWDCount(userInfo);
  342. }
  343. } catch(Exception e) {
  344. e.printStackTrace();
  345. }
  346. }
  347. public boolean updateSharedSecret(UserInfo userInfo){
  348. return getMapper().updateSharedSecret(userInfo)>0;
  349. }
  350. public boolean updatePasswordQuestion(UserInfo userInfo){
  351. return getMapper().updatePasswordQuestion(userInfo)>0;
  352. }
  353. public boolean updateAuthnType(UserInfo userInfo){
  354. return getMapper().updateAuthnType(userInfo)>0;
  355. }
  356. public boolean updateEmail(UserInfo userInfo){
  357. return getMapper().updateEmail(userInfo)>0;
  358. }
  359. public boolean updateMobile(UserInfo userInfo){
  360. return getMapper().updateMobile(userInfo)>0;
  361. }
  362. public int updateProfile(UserInfo userInfo){
  363. return getMapper().updateProfile(userInfo);
  364. }
  365. public void setPasswordPolicyValidator(PasswordPolicyValidator passwordPolicyValidator) {
  366. this.passwordPolicyValidator = passwordPolicyValidator;
  367. }
  368. }