add 权限增加是否外网展示

This commit is contained in:
lijiarao
2023-08-23 18:17:12 +08:00
parent 7290aea066
commit b49bc36c1a
8 changed files with 48 additions and 15 deletions
+1
View File
@@ -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';
@@ -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;
}
}
@@ -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后过期
*
@@ -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);
@@ -74,7 +74,7 @@ public class JwtFilter extends BasicHttpAuthenticationFilter {
authenticationUtils.check(pushToken,publicKey);
}else {
// update-end--Author:lvdandan Date:20210105 forJT-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进行登入,如果错误他会抛出异常并被捕获
@@ -82,7 +82,7 @@ public class LoginController {
@ApiOperation("登录接口")
@RequestMapping(value = "/login", method = RequestMethod.POST)
public Result<JSONObject> login(@RequestBody SysLoginModel sysLoginModel) {
public Result<JSONObject> login(@RequestBody SysLoginModel sysLoginModel,HttpServletRequest request) {
Result<JSONObject> 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();
@@ -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);
@@ -727,8 +727,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
public Result<JSONObject> userInfo(SysUser sysUser, Result<JSONObject> 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);