diff --git a/qiaoba-apis/qiaoba-api-auth/src/main/java/com/qiaoba/api/auth/entity/LoginUser.java b/qiaoba-apis/qiaoba-api-auth/src/main/java/com/qiaoba/api/auth/entity/LoginUser.java index a3fb3bc..a5caaa7 100644 --- a/qiaoba-apis/qiaoba-api-auth/src/main/java/com/qiaoba/api/auth/entity/LoginUser.java +++ b/qiaoba-apis/qiaoba-api-auth/src/main/java/com/qiaoba/api/auth/entity/LoginUser.java @@ -23,10 +23,6 @@ public class LoginUser implements UserDetails { private static final long serialVersionUID = 1L; - /** - * 设备号 暂用UUID - */ - private String deviceSn; /** * 用户ID */ @@ -64,8 +60,7 @@ public class LoginUser implements UserDetails { public LoginUser() { } - public LoginUser(String deviceSn, String userId, String deptId, String username, String nickname, List roles, List roleKeys, Set permissions) { - this.deviceSn = deviceSn; + public LoginUser(String userId, String deptId, String username, String nickname, List roles, List roleKeys, Set permissions) { this.userId = userId; this.deptId = deptId; this.username = username; @@ -75,14 +70,6 @@ public class LoginUser implements UserDetails { this.roles = roles; } - public String getDeviceSn() { - return deviceSn; - } - - public void setDeviceSn(String deviceSn) { - this.deviceSn = deviceSn; - } - public List getRoles() { return roles; } diff --git a/qiaoba-apis/qiaoba-api-auth/src/main/java/com/qiaoba/api/auth/utils/TokenUtil.java b/qiaoba-apis/qiaoba-api-auth/src/main/java/com/qiaoba/api/auth/utils/TokenUtil.java index f0a8615..6a41026 100644 --- a/qiaoba-apis/qiaoba-api-auth/src/main/java/com/qiaoba/api/auth/utils/TokenUtil.java +++ b/qiaoba-apis/qiaoba-api-auth/src/main/java/com/qiaoba/api/auth/utils/TokenUtil.java @@ -17,12 +17,10 @@ import javax.servlet.http.HttpServletRequest; */ public class TokenUtil { - /** - * jwt 加解密密钥,第一次项目启动时创建随机数 + * token 过期时间 单位: 小时 */ - public static String secret; - public static Integer expireTime = 72; + public static final Integer TOKEN_EXPIRE_HOUR_TIME = 3; private static final String TOKEN_TEMPLATE = "{}:{}"; public static String generateToken(String username, String deviceSn) { diff --git a/qiaoba-auth/src/main/java/com/qiaoba/auth/filters/SecurityContextHolderFilter.java b/qiaoba-auth/src/main/java/com/qiaoba/auth/filters/SecurityContextHolderFilter.java index 3ff8c09..11d4ae6 100644 --- a/qiaoba-auth/src/main/java/com/qiaoba/auth/filters/SecurityContextHolderFilter.java +++ b/qiaoba-auth/src/main/java/com/qiaoba/auth/filters/SecurityContextHolderFilter.java @@ -1,8 +1,10 @@ package com.qiaoba.auth.filters; import cn.hutool.core.util.StrUtil; +import com.qiaoba.api.auth.entity.dto.OnlineUserDto; import com.qiaoba.api.auth.utils.TokenUtil; import com.qiaoba.auth.properties.AuthConfigProperties; +import com.qiaoba.common.base.context.BaseContext; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -40,9 +42,10 @@ public class SecurityContextHolderFilter extends OncePerRequestFilter { FilterChain chain) throws ServletException, IOException { log.debug("Start run SecurityContextHolderFilter, Uri: {}", request.getRequestURI()); - String username = TokenUtil.analyzeUsername(request); - if (StrUtil.isNotBlank(username)) { - UserDetails userDetails = userDetailsService.loadUserByUsername(username); + String token = TokenUtil.getToken(request,true); + if (StrUtil.isNotBlank(token)) { + OnlineUserDto userDto = TokenUtil.getUsernameAndDeviceSn(token); + UserDetails userDetails = userDetailsService.loadUserByUsername(userDto.getUsername()); // 更新 SecurityContextHolder Authentication, 为了保证 SecurityContext 上下文中 userDetails 是最新的 if (Objects.nonNull(userDetails) && Objects.isNull(SecurityContextHolder.getContext().getAuthentication())) { UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); diff --git a/qiaoba-auth/src/main/java/com/qiaoba/auth/handler/LogoutHandler.java b/qiaoba-auth/src/main/java/com/qiaoba/auth/handler/LogoutHandler.java index bf02fbd..6971841 100644 --- a/qiaoba-auth/src/main/java/com/qiaoba/auth/handler/LogoutHandler.java +++ b/qiaoba-auth/src/main/java/com/qiaoba/auth/handler/LogoutHandler.java @@ -1,8 +1,11 @@ package com.qiaoba.auth.handler; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.qiaoba.api.auth.entity.LoginUser; +import com.qiaoba.api.auth.entity.dto.OnlineUserDto; import com.qiaoba.api.auth.service.OnlineUserService; +import com.qiaoba.api.auth.utils.TokenUtil; import lombok.RequiredArgsConstructor; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; @@ -28,10 +31,15 @@ public class LogoutHandler implements LogoutSuccessHandler { @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { - // 删除缓存中的用户信息 - if (ObjectUtil.isNotEmpty(authentication) && ObjectUtil.isNotEmpty(authentication.getPrincipal())) { - LoginUser user = (LoginUser) authentication.getPrincipal(); - onlineUserService.deleteOne(user.getUsername(), user.getDeviceSn(), true); + String token = TokenUtil.getToken(request, true); + if (StrUtil.isNotBlank(token)) { + try { + // 删除缓存中的用户信息 + OnlineUserDto userDto = TokenUtil.getUsernameAndDeviceSn(token); + onlineUserService.deleteOne(userDto.getUsername(), userDto.getDeviceSn(), true); + } catch (Exception e) { + + } } } } diff --git a/qiaoba-auth/src/main/java/com/qiaoba/auth/service/impl/OnlineUserServiceImpl.java b/qiaoba-auth/src/main/java/com/qiaoba/auth/service/impl/OnlineUserServiceImpl.java index aa1d064..6f85046 100644 --- a/qiaoba-auth/src/main/java/com/qiaoba/auth/service/impl/OnlineUserServiceImpl.java +++ b/qiaoba-auth/src/main/java/com/qiaoba/auth/service/impl/OnlineUserServiceImpl.java @@ -38,7 +38,7 @@ public class OnlineUserServiceImpl implements OnlineUserService { @Override public void insert(OnlineUser onlineUser) { - redisService.set(handleKey(onlineUser.getUsername(), onlineUser.getDeviceSn()), onlineUser, TokenUtil.expireTime * 3600); + redisService.set(handleKey(onlineUser.getUsername(), onlineUser.getDeviceSn()), onlineUser, TokenUtil.TOKEN_EXPIRE_HOUR_TIME * 3600); } @Override diff --git a/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/context/BaseContext.java b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/context/BaseContext.java index 1ee9952..696f9d5 100644 --- a/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/context/BaseContext.java +++ b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/context/BaseContext.java @@ -110,5 +110,4 @@ public class BaseContext { SCHEMA_HOLDER.remove(); } - } diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysLoginServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysLoginServiceImpl.java index 411a06b..00f09b8 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysLoginServiceImpl.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysLoginServiceImpl.java @@ -168,7 +168,7 @@ public class SysLoginServiceImpl implements SysLoginService { String os = userAgent.getOs().getName(); if (!authConfigApiService.checkAllowBothOnline()) { - redisService.set(SecurityConstant.LOGGED_USER_REDIS_KEY + username, deviceSn, TokenUtil.expireTime * 3600); + redisService.set(SecurityConstant.LOGGED_USER_REDIS_KEY + username, deviceSn, TokenUtil.TOKEN_EXPIRE_HOUR_TIME * 3600); } OnlineUser onlineUser = new OnlineUser(deviceSn, username, nickname, ip, address, browser, os, new Date()); onlineUserService.insert(onlineUser); diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserDetailsServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserDetailsServiceImpl.java index f988d50..2d98e5f 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserDetailsServiceImpl.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserDetailsServiceImpl.java @@ -43,23 +43,24 @@ public class SysUserDetailsServiceImpl implements UserDetailsService, SysUserDet @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { SecurityUser user = redisService.getObject(SecurityConstant.USER_DETAILS_REDIS_KEY + username, SecurityUser.class); - return Objects.isNull(user) ? null : new LoginUser(user.getDeviceSn(), user.getUserId(), user.getDeptId(), user.getUsername(), user.getNickname(), user.getRoles(), user.getRoleKeys(), user.getPermissions()); + return Objects.isNull(user) ? null : new LoginUser(user.getUserId(), user.getDeptId(), user.getUsername(), user.getNickname(), user.getRoles(), user.getRoleKeys(), user.getPermissions()); } - private UserDetails createUserDetails(SysUser user, String deviceSn) { + private UserDetails createUserDetails(SysUser user) { Set perms = sysMenuService.selectPermsByUserId(user.getUserId()); List roles = sysUserRoleService.selectRoleDtoByUserId(user.getUserId(), BaseEnum.NORMAL.getCode()); List roleKeys = roles.stream().map(RoleDto::getRoleKey).collect(Collectors.toList()); - return new LoginUser(deviceSn, user.getUserId(), user.getDeptId(), user.getUsername(), user.getNickname(), roles, roleKeys, perms); + return new LoginUser(user.getUserId(), user.getDeptId(), user.getUsername(), user.getNickname(), roles, roleKeys, perms); } @Override public UserDetails toCache(String username, String deviceSn) { SysUser user = sysUserService.selectByUsername(username); - UserDetails details = createUserDetails(user, deviceSn); + UserDetails details = createUserDetails(user); SecurityUser securityUser = BeanUtil.copyProperties(details, SecurityUser.class); - redisService.set(SecurityConstant.USER_DETAILS_REDIS_KEY + username, securityUser, TokenUtil.expireTime * 3600); + securityUser.setDeviceSn(deviceSn); + redisService.set(SecurityConstant.USER_DETAILS_REDIS_KEY + username, securityUser, TokenUtil.TOKEN_EXPIRE_HOUR_TIME * 3600); return details; }