UserInfoService.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  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.repository.PasswordPolicyValidator;
  26. import org.maxkey.provision.ProvisionService;
  27. import org.maxkey.provision.ProvisionAction;
  28. import org.maxkey.provision.ProvisionTopic;
  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.security.crypto.password.PasswordEncoder;
  36. import org.springframework.stereotype.Repository;
  37. /**
  38. * @author Crystal.Sea
  39. *
  40. */
  41. @Repository
  42. public class UserInfoService extends JpaBaseService<UserInfo> {
  43. final static Logger _logger = LoggerFactory.getLogger(UserInfoService.class);
  44. @Autowired
  45. private PasswordEncoder passwordEncoder;
  46. @Autowired
  47. PasswordPolicyValidator passwordPolicyValidator;
  48. @Autowired
  49. ProvisionService provisionService;
  50. AccountsService accountsService;
  51. public UserInfoService() {
  52. super(UserInfoMapper.class);
  53. }
  54. /* (non-Javadoc)
  55. * @see com.connsec.db.service.BaseService#getMapper()
  56. */
  57. @Override
  58. public UserInfoMapper getMapper() {
  59. return (UserInfoMapper)super.getMapper();
  60. }
  61. public boolean insert(UserInfo userInfo) {
  62. this.passwordEncoder(userInfo);
  63. if (super.insert(userInfo)) {
  64. if(provisionService.getApplicationConfig().isProvisionSupport()) {
  65. UserInfo loadUserInfo = findUserRelated(userInfo.getId());
  66. provisionService.send(
  67. ProvisionTopic.USERINFO_TOPIC,
  68. loadUserInfo,
  69. ProvisionAction.CREATE_ACTION);
  70. }
  71. return true;
  72. }
  73. return false;
  74. }
  75. public boolean insert(UserInfo userInfo,boolean passwordEncoder) {
  76. if(passwordEncoder) {
  77. this.passwordEncoder(userInfo);
  78. }
  79. if (super.insert(userInfo)) {
  80. if(provisionService.getApplicationConfig().isProvisionSupport()) {
  81. UserInfo loadUserInfo = findUserRelated(userInfo.getId());
  82. provisionService.send(
  83. ProvisionTopic.USERINFO_TOPIC,
  84. loadUserInfo,
  85. ProvisionAction.CREATE_ACTION);
  86. }
  87. return true;
  88. }
  89. return false;
  90. }
  91. public boolean update(UserInfo userInfo) {
  92. ChangePassword changePassword = this.passwordEncoder(userInfo);
  93. if (super.update(userInfo)) {
  94. if(provisionService.getApplicationConfig().isProvisionSupport()) {
  95. UserInfo loadUserInfo = findUserRelated(userInfo.getId());
  96. accountUpdate(loadUserInfo);
  97. provisionService.send(
  98. ProvisionTopic.USERINFO_TOPIC,
  99. loadUserInfo,
  100. ProvisionAction.UPDATE_ACTION);
  101. }
  102. if(userInfo.getPassword() != null) {
  103. changePasswordProvisioning(changePassword);
  104. }
  105. return true;
  106. }
  107. return false;
  108. }
  109. public boolean delete(UserInfo userInfo) {
  110. UserInfo loadUserInfo = null;
  111. if(provisionService.getApplicationConfig().isProvisionSupport()) {
  112. loadUserInfo = findUserRelated(userInfo.getId());
  113. }
  114. if( super.delete(userInfo)){
  115. provisionService.send(
  116. ProvisionTopic.USERINFO_TOPIC,
  117. loadUserInfo,
  118. ProvisionAction.DELETE_ACTION);
  119. accountUpdate(loadUserInfo);
  120. return true;
  121. }
  122. return false;
  123. }
  124. //更新账号状态
  125. public void accountUpdate(UserInfo userInfo) {
  126. if(userInfo.getStatus() != ConstsStatus.ACTIVE) {
  127. if(accountsService==null) {
  128. accountsService =
  129. WebContext.getBean("accountsService",AccountsService.class);
  130. }
  131. Accounts queryAcount =new Accounts();
  132. queryAcount.setUserId(userInfo.getId());
  133. for (Accounts acount : accountsService.query(queryAcount)) {
  134. acount.setStatus(ConstsStatus.INACTIVE);
  135. accountsService.update(acount);
  136. }
  137. }
  138. }
  139. public UserInfo findUserRelated(String userId) {
  140. UserInfo loadUserInfo =this.get(userId);
  141. loadUserInfo.setDepts(getMapper().findDeptsByUserId(userId));
  142. loadUserInfo.setAdjoints(getMapper().findAdjointsByUserId(userId));
  143. return loadUserInfo;
  144. }
  145. public boolean updateGridList(String gridList,UserInfo userInfo) {
  146. try {
  147. if (gridList != null && !gridList.equals("")) {
  148. userInfo.setGridList(Integer.parseInt(gridList));
  149. getMapper().updateGridList(userInfo);
  150. }
  151. }catch(Exception e) {
  152. e.printStackTrace();
  153. return false;
  154. }
  155. return true;
  156. }
  157. public void saveOrUpdate(UserInfo userInfo) {
  158. UserInfo loadUserInfo = findOne(" username = ? and instid = ?",
  159. new Object[] { userInfo.getUsername(),userInfo.getInstId() },
  160. new int[] { Types.VARCHAR,Types.VARCHAR});
  161. if(loadUserInfo == null) {
  162. insert(userInfo);
  163. }else {
  164. userInfo.setId(loadUserInfo.getId());
  165. userInfo.setPassword(null);
  166. update(userInfo);
  167. }
  168. }
  169. public boolean updateProtectedApps(UserInfo userinfo) {
  170. try {
  171. userinfo.setModifiedDate(DateUtils.getCurrentDateTimeAsString());
  172. return getMapper().updateProtectedApps(userinfo) > 0;
  173. } catch (Exception e) {
  174. e.printStackTrace();
  175. }
  176. return false;
  177. }
  178. public UserInfo findByUsername(String username) {
  179. return getMapper().findByUsername(username);
  180. }
  181. public UserInfo findByEmailMobile(String emailMobile) {
  182. return getMapper().findByEmailMobile(emailMobile);
  183. }
  184. public UserInfo findByAppIdAndUsername(String appId,String username){
  185. try {
  186. UserInfo userinfo = new UserInfo();
  187. userinfo.setUsername(username);
  188. return getMapper().findByAppIdAndUsername(userinfo) ;
  189. } catch (Exception e) {
  190. e.printStackTrace();
  191. }
  192. return null;
  193. }
  194. public ChangePassword passwordEncoder(UserInfo userInfo) {
  195. ChangePassword changePassword = null;
  196. if(StringUtils.isNotBlank(userInfo.getPassword())) {
  197. changePassword = new ChangePassword(userInfo);
  198. passwordEncoder(changePassword);
  199. userInfo.setPassword(changePassword.getPassword());
  200. userInfo.setDecipherable(changePassword.getDecipherable());
  201. userInfo.setPasswordLastSetTime(changePassword.getPasswordLastSetTime());
  202. }else {
  203. userInfo.setPassword(null);
  204. userInfo.setDecipherable(null);
  205. }
  206. return changePassword;
  207. }
  208. public ChangePassword passwordEncoder(ChangePassword changePassword) {
  209. //密码不为空,则需要进行加密处理
  210. if(StringUtils.isNotBlank(changePassword.getPassword())) {
  211. String password = passwordEncoder.encode(changePassword.getPassword());
  212. changePassword.setDecipherable(PasswordReciprocal.getInstance().encode(changePassword.getPassword()));
  213. _logger.debug("decipherable : "+changePassword.getDecipherable());
  214. changePassword.setPassword(password);
  215. changePassword.setPasswordLastSetTime(DateUtils.getCurrentDateTimeAsString());
  216. }else {
  217. changePassword.setPassword(null);
  218. changePassword.setDecipherable(null);
  219. }
  220. return changePassword;
  221. }
  222. /**
  223. * 认证密码修改
  224. * @param oldPassword
  225. * @param newPassword
  226. * @param confirmPassword
  227. * @param passwordSetType
  228. * @return
  229. */
  230. public boolean changePassword( ChangePassword changePassword) {
  231. try {
  232. WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT, "");
  233. UserInfo userInfo = this.findByUsername(changePassword.getUsername());
  234. if(changePassword.getPassword().equals(changePassword.getConfirmPassword())){
  235. if(StringUtils.isNotBlank(changePassword.getOldPassword()) ||
  236. passwordEncoder.matches(changePassword.getOldPassword(), userInfo.getPassword())){
  237. if(changePassword(changePassword,true) ){
  238. return true;
  239. }
  240. return false;
  241. }else {
  242. if(StringUtils.isNotBlank(changePassword.getOldPassword())&&
  243. passwordEncoder.matches(changePassword.getPassword(), userInfo.getPassword())) {
  244. WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT,
  245. WebContext.getI18nValue("PasswordPolicy.OLD_PASSWORD_MATCH"));
  246. }else {
  247. WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT,
  248. WebContext.getI18nValue("PasswordPolicy.OLD_PASSWORD_NOT_MATCH"));
  249. }
  250. }
  251. }else {
  252. WebContext.setAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT,
  253. WebContext.getI18nValue("PasswordPolicy.CONFIRMPASSWORD_NOT_MATCH"));
  254. }
  255. } catch (Exception e) {
  256. e.printStackTrace();
  257. }
  258. return false;
  259. }
  260. /**
  261. * 后台密码修改
  262. * @param changeUserInfo
  263. * @param passwordPolicy
  264. * @return
  265. */
  266. public boolean changePassword(ChangePassword changePassword,boolean passwordPolicy) {
  267. try {
  268. _logger.debug("decipherable old : " + changePassword.getDecipherable());
  269. _logger.debug("decipherable new : " + PasswordReciprocal.getInstance().encode(changePassword.getDecipherable()));
  270. if (passwordPolicy && passwordPolicyValidator.validator(changePassword) == false) {
  271. return false;
  272. }
  273. changePassword = passwordEncoder(changePassword);
  274. if (getMapper().changePassword(changePassword) > 0) {
  275. changePasswordProvisioning(changePassword);
  276. return true;
  277. }
  278. return false;
  279. } catch (Exception e) {
  280. e.printStackTrace();
  281. }
  282. return false;
  283. }
  284. public String randomPassword() {
  285. return passwordPolicyValidator.generateRandomPassword();
  286. }
  287. public void changePasswordProvisioning(ChangePassword changePassworded) {
  288. if(changePassworded !=null && StringUtils.isNotBlank(changePassworded.getPassword())) {
  289. UserInfo loadUserInfo = findByUsername(changePassworded.getUsername());
  290. ChangePassword changePassword = new ChangePassword(loadUserInfo);
  291. provisionService.send(
  292. ProvisionTopic.PASSWORD_TOPIC,
  293. changePassword,
  294. ProvisionAction.PASSWORD_ACTION);
  295. }
  296. }
  297. public boolean updateAppLoginPassword(UserInfo userinfo) {
  298. try {
  299. userinfo.setModifiedDate(DateUtils.getCurrentDateTimeAsString());
  300. return getMapper().updateAppLoginPassword(userinfo) > 0;
  301. } catch (Exception e) {
  302. e.printStackTrace();
  303. }
  304. return false;
  305. }
  306. /**
  307. * 锁定用户:islock:1 用户解锁 2 用户锁定
  308. * @param userInfo
  309. */
  310. public void updateLocked(UserInfo userInfo) {
  311. try {
  312. if(userInfo != null && StringUtils.isNotEmpty(userInfo.getId())) {
  313. userInfo.setIsLocked(ConstsStatus.LOCK);
  314. getMapper().updateLocked(userInfo);
  315. }
  316. } catch(Exception e) {
  317. e.printStackTrace();
  318. }
  319. }
  320. /**
  321. * 用户登录成功后,重置错误密码次数和解锁用户
  322. * @param userInfo
  323. */
  324. public void updateLockout(UserInfo userInfo) {
  325. try {
  326. if(userInfo != null && StringUtils.isNotEmpty(userInfo.getId())) {
  327. userInfo.setIsLocked(ConstsStatus.START);
  328. userInfo.setBadPasswordCount(0);
  329. getMapper().updateLockout(userInfo);
  330. }
  331. } catch(Exception e) {
  332. e.printStackTrace();
  333. }
  334. }
  335. /**
  336. * 更新错误密码次数
  337. * @param userInfo
  338. */
  339. public void updateBadPasswordCount(UserInfo userInfo) {
  340. try {
  341. if(userInfo != null && StringUtils.isNotEmpty(userInfo.getId())) {
  342. int updateBadPWDCount = userInfo.getBadPasswordCount() + 1;
  343. userInfo.setBadPasswordCount(updateBadPWDCount);
  344. getMapper().updateBadPWDCount(userInfo);
  345. }
  346. } catch(Exception e) {
  347. e.printStackTrace();
  348. }
  349. }
  350. public boolean updateSharedSecret(UserInfo userInfo){
  351. return getMapper().updateSharedSecret(userInfo)>0;
  352. }
  353. public boolean updatePasswordQuestion(UserInfo userInfo){
  354. return getMapper().updatePasswordQuestion(userInfo)>0;
  355. }
  356. public boolean updateAuthnType(UserInfo userInfo){
  357. return getMapper().updateAuthnType(userInfo)>0;
  358. }
  359. public boolean updateEmail(UserInfo userInfo){
  360. return getMapper().updateEmail(userInfo)>0;
  361. }
  362. public boolean updateMobile(UserInfo userInfo){
  363. return getMapper().updateMobile(userInfo)>0;
  364. }
  365. public int updateProfile(UserInfo userInfo){
  366. return getMapper().updateProfile(userInfo);
  367. }
  368. public boolean updateStatus(UserInfo userInfo) {
  369. return getMapper().updateStatus(userInfo) > 0;
  370. }
  371. public void setPasswordPolicyValidator(PasswordPolicyValidator passwordPolicyValidator) {
  372. this.passwordPolicyValidator = passwordPolicyValidator;
  373. }
  374. }