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