se-modules/se-system/src/main/java/com/se/system/controller/TokenController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-modules/se-system/src/main/java/com/se/system/domain/LoginBody.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-modules/se-system/src/main/java/com/se/system/domain/RegisterBody.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-modules/se-system/src/main/java/com/se/system/service/SysLoginService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-modules/se-system/src/main/java/com/se/system/service/SysPasswordService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-modules/se-system/src/main/java/com/se/system/service/SysRecordLogService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
se-modules/se-system/src/main/java/com/se/system/controller/TokenController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,95 @@ package com.se.system.controller; import com.se.common.core.domain.R; import com.se.common.core.utils.AesUtils; import com.se.common.core.utils.JwtUtils; import com.se.common.core.utils.StringUtils; import com.se.common.security.auth.AuthUtil; import com.se.common.security.service.TokenService; import com.se.common.security.utils.SecurityUtils; import com.se.system.api.model.LoginUser; import com.se.system.domain.LoginBody; import com.se.system.service.SysLoginService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; /** * token æ§å¶ * * @author admin */ @RestController public class TokenController { @Resource private TokenService tokenService; @Autowired private SysLoginService sysLoginService; @Value("${enableEncrypt}") boolean enableEncrypt; @PostMapping("login") public R<?> login(@RequestBody LoginBody form) throws Exception { if (enableEncrypt && !StringUtils.isEmpty(form.getPassword())) { form.setPassword(AesUtils.decrypt(form.getPassword())); } // ç¨æ·ç»å½ LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword()); // è·åç»å½token return R.ok(tokenService.createToken(userInfo)); } @GetMapping("validate") @PostMapping("validate") public R<Object> validate(HttpServletRequest request) { try { boolean flag = false; String token = SecurityUtils.getToken(request); if (!StringUtils.isNotEmpty(token)) { String userName = JwtUtils.getUserName(token); flag = !StringUtils.isEmpty(userName); } return R.ok(flag); } catch (Exception ex) { return R.fail(ex.getMessage()); } } @DeleteMapping("logout") public R<?> logout(HttpServletRequest request) { String token = SecurityUtils.getToken(request); if (StringUtils.isNotEmpty(token)) { String username = JwtUtils.getUserName(token); // å é¤ç¨æ·ç¼åè®°å½ AuthUtil.logoutByToken(token); // è®°å½ç¨æ·éåºæ¥å¿ sysLoginService.logout(username); } return R.ok(); } @PostMapping("refresh") public R<?> refresh(HttpServletRequest request) { LoginUser loginUser = tokenService.getLoginUser(request); if (StringUtils.isNotNull(loginUser)) { // å·æ°ä»¤çæææ tokenService.refreshToken(loginUser); return R.ok(); } return R.ok(); } /*@PostMapping("register") public R<?> register(@RequestBody RegisterBody registerBody) { // ç¨æ·æ³¨å sysLoginService.register(registerBody.getUsername(), registerBody.getPassword()); return R.ok(); }*/ } se-modules/se-system/src/main/java/com/se/system/domain/LoginBody.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ package com.se.system.domain; /** * ç¨æ·ç»å½å¯¹è±¡ * * @author admin */ public class LoginBody { /** * ç¨æ·å */ private String username; /** * ç¨æ·å¯ç */ private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } se-modules/se-system/src/main/java/com/se/system/domain/RegisterBody.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,11 @@ package com.se.system.domain; /** * ç¨æ·æ³¨å对象 * * @author admin */ public class RegisterBody extends LoginBody { } se-modules/se-system/src/main/java/com/se/system/service/SysLoginService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,163 @@ package com.se.system.service; import com.se.common.core.constant.CacheConstants; import com.se.common.core.constant.Constants; import com.se.common.core.constant.SecurityConstants; import com.se.common.core.constant.UserConstants; import com.se.common.core.domain.R; import com.se.common.core.enums.UserStatus; import com.se.common.core.exception.ServiceException; import com.se.common.core.text.Convert; import com.se.common.core.utils.DateUtils; import com.se.common.core.utils.StringUtils; import com.se.common.core.utils.ip.IpUtils; import com.se.common.redis.service.RedisService; import com.se.common.security.utils.SecurityUtils; import com.se.system.api.RemoteUserService; import com.se.system.api.domain.SysUser; import com.se.system.api.model.LoginUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * ç»å½æ ¡éªæ¹æ³ * * @author admin */ @Component public class SysLoginService { @Autowired private RemoteUserService remoteUserService; @Autowired private SysPasswordService passwordService; @Autowired private SysRecordLogService recordLogService; @Resource private RedisService redisService; /** * ç»å½ */ public LoginUser login(String username, String password) { // ç¨æ·åæå¯ç 为空 é误 if (StringUtils.isAnyBlank(username, password)) { recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "ç¨æ·/å¯ç å¿ é¡»å¡«å"); throw new ServiceException("ç¨æ·/å¯ç å¿ é¡»å¡«å"); } // å¯ç 妿ä¸å¨æå®èå´å é误 if (password.length() < UserConstants.PASSWORD_MIN_LENGTH || password.length() > UserConstants.PASSWORD_MAX_LENGTH) { recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "ç¨æ·å¯ç ä¸å¨æå®èå´"); throw new ServiceException("ç¨æ·å¯ç ä¸å¨æå®èå´"); } // ç¨æ·åä¸å¨æå®èå´å é误 if (username.length() < UserConstants.USERNAME_MIN_LENGTH || username.length() > UserConstants.USERNAME_MAX_LENGTH) { recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "ç¨æ·åä¸å¨æå®èå´"); throw new ServiceException("ç¨æ·åä¸å¨æå®èå´"); } // IPé»ååæ ¡éª String blackStr = Convert.toStr(redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST)); if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) { recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "å¾éæ¾ï¼è®¿é®IP已被åå ¥ç³»ç»é»åå"); throw new ServiceException("å¾éæ¾ï¼è®¿é®IP已被åå ¥ç³»ç»é»åå"); } // æ¥è¯¢ç¨æ·ä¿¡æ¯ R<LoginUser> userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER); if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) { recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "ç»å½ç¨æ·ä¸åå¨"); throw new ServiceException("ç»å½ç¨æ·ï¼" + username + " ä¸åå¨"); } if (R.FAIL == userResult.getCode()) { throw new ServiceException(userResult.getMsg()); } LoginUser userInfo = userResult.getData(); SysUser user = userResult.getData().getSysUser(); if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "对ä¸èµ·ï¼æ¨çè´¦å·å·²è¢«å é¤"); throw new ServiceException("对ä¸èµ·ï¼æ¨çè´¦å·ï¼" + username + " 已被å é¤"); } if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "ç¨æ·å·²åç¨ï¼è¯·è系管çå"); throw new ServiceException("对ä¸èµ·ï¼æ¨çè´¦å·ï¼" + username + " å·²åç¨"); } passwordService.validate(user, password); recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, "ç»å½æå"); recordLoginInfo(user.getUserId()); return userInfo; } /** * è®°å½ç»å½ä¿¡æ¯ * * @param userId ç¨æ·ID */ public void recordLoginInfo(Long userId) { SysUser sysUser = new SysUser(); sysUser.setUserId(userId); // æ´æ°ç¨æ·ç»å½IP sysUser.setLoginIp(IpUtils.getIpAddr()); // æ´æ°ç¨æ·ç»å½æ¶é´ sysUser.setLoginDate(DateUtils.getNowDate()); remoteUserService.recordUserLogin(sysUser, SecurityConstants.INNER); } public void logout(String loginName) { recordLogService.recordLogininfor(loginName, Constants.LOGOUT, "éåºæå"); } /** * 注å */ public void register(String username, String password) { // ç¨æ·åæå¯ç 为空 é误 if (StringUtils.isAnyBlank(username, password)) { throw new ServiceException("ç¨æ·/å¯ç å¿ é¡»å¡«å"); } if (username.length() < UserConstants.USERNAME_MIN_LENGTH || username.length() > UserConstants.USERNAME_MAX_LENGTH) { throw new ServiceException("è´¦æ·é¿åº¦å¿ é¡»å¨2å°20个å符ä¹é´"); } if (password.length() < UserConstants.PASSWORD_MIN_LENGTH || password.length() > UserConstants.PASSWORD_MAX_LENGTH) { throw new ServiceException("å¯ç é¿åº¦å¿ é¡»å¨5å°20个å符ä¹é´"); } // 注åç¨æ·ä¿¡æ¯ SysUser sysUser = new SysUser(); sysUser.setUserName(username); sysUser.setNickName(username); sysUser.setPassword(SecurityUtils.encryptPassword(password)); R<?> registerResult = remoteUserService.registerUserInfo(sysUser, SecurityConstants.INNER); if (R.FAIL == registerResult.getCode()) { throw new ServiceException(registerResult.getMsg()); } recordLogService.recordLogininfor(username, Constants.REGISTER, "注åæå"); } } se-modules/se-system/src/main/java/com/se/system/service/SysPasswordService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,87 @@ package com.se.system.service; import com.se.common.core.constant.CacheConstants; import com.se.common.core.constant.Constants; import com.se.common.core.exception.ServiceException; import com.se.common.redis.service.RedisService; import com.se.common.security.utils.SecurityUtils; import com.se.system.api.domain.SysUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; /** * ç»å½å¯ç æ¹æ³ * * @author admin */ @Component @SuppressWarnings("ALL") public class SysPasswordService { @Autowired private RedisService redisService; private int maxRetryCount = CacheConstants.PASSWORD_MAX_RETRY_COUNT; private Long lockTime = CacheConstants.PASSWORD_LOCK_TIME; @Autowired private SysRecordLogService recordLogService; /** * ç»å½è´¦æ·å¯ç é误次æ°ç¼åé®å * * @param username ç¨æ·å * @return ç¼åé®key */ private String getCacheKey(String username) { return CacheConstants.PWD_ERR_CNT_KEY + username; } public void validate(SysUser user, String password) { String username = user.getUserName(); Integer retryCount = redisService.getCacheObject(getCacheKey(username)); if (retryCount == null) { retryCount = 0; } /*if (retryCount >= Integer.valueOf(maxRetryCount).intValue()) { String errMsg = String.format("å¯ç è¾å ¥é误%s次ï¼å¸æ·éå®%såé", maxRetryCount, lockTime); recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL,errMsg); throw new ServiceException(errMsg); }*/ if (!matches(user, password)) { retryCount = retryCount + 1; recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, String.format("å¯ç è¾å ¥é误%s次", retryCount)); redisService.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES); throw new ServiceException("ç¨æ·ä¸åå¨/å¯ç é误"); } else { clearLoginRecordCache(username); } } public boolean matches(SysUser user, String rawPassword) { return SecurityUtils.matchesPassword(rawPassword, user.getPassword()); } public void clearLoginRecordCache(String loginName) { if (redisService.hasKey(getCacheKey(loginName))) { redisService.deleteObject(getCacheKey(loginName)); } } } se-modules/se-system/src/main/java/com/se/system/service/SysRecordLogService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,48 @@ package com.se.system.service; import com.se.common.core.constant.Constants; import com.se.common.core.constant.SecurityConstants; import com.se.common.core.utils.StringUtils; import com.se.common.core.utils.ip.IpUtils; import com.se.system.api.RemoteLogService; import com.se.system.api.domain.SysLogininfor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * è®°å½æ¥å¿æ¹æ³ * * @author admin */ @Component public class SysRecordLogService { @Autowired private RemoteLogService remoteLogService; /** * è®°å½ç»å½ä¿¡æ¯ * * @param username ç¨æ·å * @param status ç¶æ * @param message æ¶æ¯å 容 * @return */ public void recordLogininfor(String username, String status, String message) { SysLogininfor logininfor = new SysLogininfor(); logininfor.setUserName(username); logininfor.setIpaddr(IpUtils.getIpAddr()); logininfor.setMsg(message); // æ¥å¿ç¶æ if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { logininfor.setStatus(Constants.LOGIN_SUCCESS_STATUS); } else if (Constants.LOGIN_FAIL.equals(status)) { logininfor.setStatus(Constants.LOGIN_FAIL_STATUS); } remoteLogService.saveLogininfor(logininfor, SecurityConstants.INNER); } }