diff --git a/db/23年8月23日变更.sql b/db/23年8月23日变更.sql index 1382cc2c..2721e7a1 100644 --- a/db/23年8月23日变更.sql +++ b/db/23年8月23日变更.sql @@ -1,5 +1,6 @@ alter table sys_permission add external_terminal_show tinyint null comment '是否外网展示'; +update sys_permission set external_terminal_show = 1; update sys_permission set external_terminal_show = 0 where id in (select t.id from (SELECT id FROM `sys_permission` WHERE `parent_id` = '1437320526513905666' AND `id` <> '1437597826593595394') t); update sys_permission set external_terminal_show = 0 where parent_id in (select t.id from (SELECT id FROM `sys_permission` WHERE `parent_id` = '1437320526513905666' AND `id` <> '1437597826593595394') t); update sys_permission set external_terminal_show = 0 where id = 'd7d6e2e4e2934f2c9385a623fd98c6f3'; diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/enums/LoginType.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/enums/LoginType.java index b7bddd2d..ee207a9c 100644 --- a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/enums/LoginType.java +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/constant/enums/LoginType.java @@ -15,11 +15,6 @@ public enum LoginType { private String type; public static LoginType getEnum(String type){ - for (LoginType value : values()) { - if (value.getType().equals(type)) { - return value; - } - } - return null; + return LoginType.INSIDE.getType().equals(type) ? LoginType.INSIDE : LoginType.EXTERNAL; } } diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java index 064c43b3..2faf3fc4 100644 --- a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java @@ -63,7 +63,19 @@ public class JwtUtil { return null; } } - + /** + * 获得token中的信息无需secret解密也能获得 + * + * @return token中包含的用户名 + */ + public static String getLoginType(String token) { + try { + DecodedJWT jwt = JWT.decode(token); + return jwt.getClaim("loginType").asString(); + } catch (JWTDecodeException e) { + return null; + } + } /** * 生成签名,5min后过期 * @@ -79,6 +91,17 @@ public class JwtUtil { } + public static String sign(String username, String loginType, String secret) { + Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); + Algorithm algorithm = Algorithm.HMAC256(secret); + // 附带username信息 + return JWT.create() + .withClaim("username", username) + .withClaim("loginType", loginType) + .withExpiresAt(date).sign(algorithm); + + } + /** * 生成签名,5min后过期 * diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroRealm.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroRealm.java index af65a9be..ce2d536a 100644 --- a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroRealm.java +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroRealm.java @@ -108,7 +108,7 @@ public class ShiroRealm extends AuthorizingRealm { throw new AuthenticationException("token为空!"); } // 校验token有效性 - LoginUser loginUser = this.checkUserTokenIsEffect(token); + LoginUser loginUser = this.checkUserTokenIsEffect(token,(JwtToken) auth); JwtToken jwtToken = (JwtToken) auth; LoginType loginType = jwtToken.getLoginType(); loginUser.setLoginType(loginType); @@ -120,7 +120,7 @@ public class ShiroRealm extends AuthorizingRealm { * * @param token */ - public LoginUser checkUserTokenIsEffect(String token) throws AuthenticationException { + public LoginUser checkUserTokenIsEffect(String token, JwtToken jwtToken) throws AuthenticationException { // 解密获得username,用于和数据库进行对比 String username = JwtUtil.getUsername(token); if (username == null) { @@ -138,7 +138,8 @@ public class ShiroRealm extends AuthorizingRealm { // throw new AuthenticationException("账号已被锁定,请联系管理员!"); //} // 校验token是否超时失效 & 或者账号密码是否错误 - if (!jwtTokenRefresh(token, username, loginUser.getPassword())) { + + if (!jwtTokenRefresh(token, username, loginUser.getPassword(),jwtToken)) { throw new AuthenticationException("Token失效,请重新登录!"); } @@ -156,9 +157,10 @@ public class ShiroRealm extends AuthorizingRealm { * * @param userName * @param passWord + * @param jwtToken * @return */ - public boolean jwtTokenRefresh(String token, String userName, String passWord) { + public boolean jwtTokenRefresh(String token, String userName, String passWord, JwtToken jwtToken) { if (userName.startsWith(LoginUserTypeEnum.company_management_.toString())){ String cacheToken = String.valueOf(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN + userName)); if (oConvertUtils.isNotEmpty(cacheToken)) { @@ -177,12 +179,18 @@ public class ShiroRealm extends AuthorizingRealm { }else{ String cacheToken = String.valueOf(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN + userName)); if (oConvertUtils.isNotEmpty(cacheToken)) { + String type = JwtUtil.getLoginType(cacheToken); + LoginType loginType1 = LoginType.getEnum(type); + LoginType loginType2 = jwtToken.getLoginType(); + if (loginType1.equals(loginType2)){ + + }else if (!token.equals(cacheToken)){ throw new AuthenticationException("已在其它设备登录,请重新登录!"); } // 校验token有效性 if (!JwtUtil.verify(cacheToken, userName, passWord)) { - String newAuthorization = JwtUtil.sign(userName, passWord); + String newAuthorization = JwtUtil.sign(userName, type, passWord); // 设置超时时间 redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + userName, newAuthorization); redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + userName, JwtUtil.EXPIRE_TIME *2 / 1000); diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/filters/JwtFilter.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/filters/JwtFilter.java index c6a6a8ac..dc73096b 100644 --- a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/filters/JwtFilter.java +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/filters/JwtFilter.java @@ -74,7 +74,7 @@ public class JwtFilter extends BasicHttpAuthenticationFilter { authenticationUtils.check(pushToken,publicKey); }else { // update-end--Author:lvdandan Date:20210105 for:JT-355 OA聊天添加token验证,获取token参数 - String externalTerminalShow = httpServletRequest.getHeader("externalTerminalShow"); + String externalTerminalShow = httpServletRequest.getHeader("Externalterminalshow"); LoginType loginType = LoginType.getEnum(externalTerminalShow); JwtToken jwtToken = new JwtToken(token,loginType); // 提交给realm进行登入,如果错误他会抛出异常并被捕获 diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/LoginController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/LoginController.java index efb9dd9b..6ad21851 100644 --- a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/LoginController.java +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/LoginController.java @@ -82,7 +82,7 @@ public class LoginController { @ApiOperation("登录接口") @RequestMapping(value = "/login", method = RequestMethod.POST) - public Result login(@RequestBody SysLoginModel sysLoginModel) { + public Result login(@RequestBody SysLoginModel sysLoginModel,HttpServletRequest request) { Result result = new Result<>(); String username = sysLoginModel.getUsername(); String password = sysLoginModel.getPassword(); @@ -159,6 +159,7 @@ public class LoginController { return result; } //用户登录信息 + sysUser.setLoginType(request.getHeader("Externalterminalshow")); sysUserService.userInfo(sysUser, result); //update-begin--Author:wangshuai Date:20200714 for:登录日志没有记录人员 LoginUser loginUser = new LoginUser(); diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java index 1d7086ad..a8834738 100644 --- a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableLogic; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.jero.common.aspect.annotation.Dict; +import com.jero.common.constant.enums.LoginType; import com.jero.common.util.PasswordUtil; import com.jero.common.util.superSearch.ConstantUtils; import com.jero.modules.system.volid.group.CreateGroup; @@ -233,6 +234,9 @@ public class SysUser implements Serializable { @TableField(exist = false) private String verifyPassword; + @TableField(exist = false) + private String loginType; + public String convertisEmail(){ if (StringUtils.isNotBlank(email)){ return PasswordUtil.decrypt(email); diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java index 646aa5ff..3e445400 100644 --- a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java @@ -727,8 +727,9 @@ public class SysUserServiceImpl extends ServiceImpl impl public Result userInfo(SysUser sysUser, Result result) { String syspassword = sysUser.getPassword(); String username = sysUser.getUsername(); + String loginType = sysUser.getLoginType(); // 生成token - String token = JwtUtil.sign(username, syspassword); + String token = JwtUtil.sign(username, loginType, syspassword); // 设置token缓存有效时间 redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + username, token); redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + username, JwtUtil.EXPIRE_TIME * 2 / 1000);