upd: 编码规范
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
package cn.odboy.constant;
|
||||
|
||||
/**
|
||||
* 常用静态常量
|
||||
*/
|
||||
public class SystemConst {
|
||||
/**
|
||||
* win 系统
|
||||
*/
|
||||
public static final String WIN = "win";
|
||||
|
||||
/**
|
||||
* mac 系统
|
||||
*/
|
||||
public static final String MAC = "mac";
|
||||
|
||||
/**
|
||||
* 请求头名称
|
||||
*/
|
||||
public static final String HEADER_NAME = "Authorization";
|
||||
|
||||
/**
|
||||
* Token前缀
|
||||
*/
|
||||
public static final String TOKEN_PREFIX = "Bearer";
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package cn.odboy.constant;
|
||||
|
||||
/**
|
||||
* 常用静态常量
|
||||
*/
|
||||
public class SystemConstant {
|
||||
/**
|
||||
* win 系统
|
||||
*/
|
||||
public static final String WIN = "win";
|
||||
|
||||
/**
|
||||
* mac 系统
|
||||
*/
|
||||
public static final String MAC = "mac";
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package cn.odboy.properties;
|
||||
|
||||
import cn.odboy.constant.SystemConstant;
|
||||
import cn.odboy.constant.SystemConst;
|
||||
import lombok.Data;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
@@ -28,9 +28,9 @@ public class FileProperties {
|
||||
|
||||
public ElPath getPath() {
|
||||
String os = System.getProperty("os.name");
|
||||
if (os.toLowerCase().startsWith(SystemConstant.WIN)) {
|
||||
if (os.toLowerCase().startsWith(SystemConst.WIN)) {
|
||||
return windows;
|
||||
} else if (os.toLowerCase().startsWith(SystemConstant.MAC)) {
|
||||
} else if (os.toLowerCase().startsWith(SystemConst.MAC)) {
|
||||
return mac;
|
||||
}
|
||||
return linux;
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package cn.odboy.server;
|
||||
|
||||
import cn.odboy.constant.SystemConst;
|
||||
import cn.odboy.util.AnonTagUtil;
|
||||
import cn.odboy.util.SecurityUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
@@ -38,9 +40,6 @@ public class SwaggerConfig {
|
||||
@Value("${server.servlet.context-path:}")
|
||||
private String apiPath;
|
||||
|
||||
@Value("${jwt.header}")
|
||||
private String tokenHeader;
|
||||
|
||||
@Value("${swagger.enabled}")
|
||||
private Boolean enabled;
|
||||
|
||||
@@ -72,7 +71,7 @@ public class SwaggerConfig {
|
||||
private List<SecurityScheme> securitySchemes() {
|
||||
//设置请求头信息
|
||||
List<SecurityScheme> securitySchemes = new ArrayList<>();
|
||||
ApiKey apiKey = new ApiKey(tokenHeader, tokenHeader, "header");
|
||||
ApiKey apiKey = new ApiKey(SystemConst.HEADER_NAME, SystemConst.HEADER_NAME, "header");
|
||||
securitySchemes.add(apiKey);
|
||||
return securitySchemes;
|
||||
}
|
||||
@@ -101,7 +100,7 @@ public class SwaggerConfig {
|
||||
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
|
||||
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
|
||||
authorizationScopes[0] = authorizationScope;
|
||||
securityReferences.add(new SecurityReference(tokenHeader, authorizationScopes));
|
||||
securityReferences.add(new SecurityReference(SystemConst.HEADER_NAME, authorizationScopes));
|
||||
return securityReferences;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.jwt.JWT;
|
||||
import cn.hutool.jwt.JWTUtil;
|
||||
import cn.odboy.constant.DataScopeEnum;
|
||||
import cn.odboy.constant.SystemConst;
|
||||
import cn.odboy.context.SpringBeanHolder;
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.alibaba.fastjson2.JSONArray;
|
||||
@@ -26,15 +27,6 @@ import java.util.Objects;
|
||||
@Slf4j
|
||||
@Component
|
||||
public class SecurityUtil {
|
||||
/**
|
||||
* 请求头名称
|
||||
*/
|
||||
public static final String HEADER = "Authorization";
|
||||
/**
|
||||
* Token前缀
|
||||
*/
|
||||
public static final String TOKEN_PREFIX = "Bearer";
|
||||
|
||||
/**
|
||||
* 获取当前登录的用户
|
||||
*
|
||||
@@ -117,10 +109,10 @@ public class SecurityUtil {
|
||||
public static String getToken() {
|
||||
HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder
|
||||
.getRequestAttributes())).getRequest();
|
||||
String bearerToken = request.getHeader(HEADER);
|
||||
if (bearerToken != null && bearerToken.startsWith(TOKEN_PREFIX)) {
|
||||
String bearerToken = request.getHeader(SystemConst.HEADER_NAME);
|
||||
if (bearerToken != null && bearerToken.startsWith(SystemConst.TOKEN_PREFIX)) {
|
||||
// 去掉令牌前缀
|
||||
return bearerToken.replace(TOKEN_PREFIX, "");
|
||||
return bearerToken.replace(SystemConst.TOKEN_PREFIX, "");
|
||||
} else {
|
||||
log.debug("非法Token:{}", bearerToken);
|
||||
}
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ import org.springframework.security.core.GrantedAuthority;
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class AuthorityDto implements GrantedAuthority {
|
||||
public class RoleCodeDto implements GrantedAuthority {
|
||||
|
||||
@ApiModelProperty(value = "角色名")
|
||||
private String authority;
|
||||
+1
-1
@@ -8,7 +8,7 @@ import javax.validation.constraints.NotBlank;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class AuthUserDto {
|
||||
public class UserAuthDto {
|
||||
|
||||
@NotBlank
|
||||
@ApiModelProperty(value = "用户名")
|
||||
+6
-6
@@ -13,7 +13,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public class JwtUserDto implements UserDetails {
|
||||
public class UserJwtDto implements UserDetails {
|
||||
|
||||
@ApiModelProperty(value = "用户")
|
||||
private final User user;
|
||||
@@ -22,10 +22,10 @@ public class JwtUserDto implements UserDetails {
|
||||
private final List<Long> dataScopes;
|
||||
|
||||
@ApiModelProperty(value = "角色")
|
||||
private final List<AuthorityDto> authorities;
|
||||
private final List<RoleCodeDto> authorities;
|
||||
|
||||
public Set<String> getRoles() {
|
||||
return authorities.stream().map(AuthorityDto::getAuthority).collect(Collectors.toSet());
|
||||
return authorities.stream().map(RoleCodeDto::getAuthority).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -40,20 +40,20 @@ public class JwtUserDto implements UserDetails {
|
||||
return user.getUsername();
|
||||
}
|
||||
|
||||
@JSONField(serialize = false)
|
||||
@Override
|
||||
@JSONField(serialize = false)
|
||||
public boolean isAccountNonExpired() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@JSONField(serialize = false)
|
||||
@Override
|
||||
@JSONField(serialize = false)
|
||||
public boolean isAccountNonLocked() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@JSONField(serialize = false)
|
||||
@Override
|
||||
@JSONField(serialize = false)
|
||||
public boolean isCredentialsNonExpired() {
|
||||
return true;
|
||||
}
|
||||
+1
-1
@@ -9,7 +9,7 @@ import java.util.Date;
|
||||
* 在线用户
|
||||
*/
|
||||
@Data
|
||||
public class OnlineUserDto {
|
||||
public class UserOnlineDto {
|
||||
@ApiModelProperty(value = "Token编号")
|
||||
private String uid;
|
||||
|
||||
+1
-15
@@ -1,5 +1,6 @@
|
||||
package cn.odboy.application.core.config;
|
||||
|
||||
import cn.odboy.util.SecurityUtil;
|
||||
import lombok.Data;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
@@ -11,17 +12,6 @@ import org.springframework.context.annotation.Configuration;
|
||||
@Configuration
|
||||
@ConfigurationProperties(prefix = "jwt")
|
||||
public class SecurityProperties {
|
||||
|
||||
/**
|
||||
* Request Headers : Authorization
|
||||
*/
|
||||
private String header;
|
||||
|
||||
/**
|
||||
* 令牌前缀,最后留个空格 Bearer
|
||||
*/
|
||||
private String tokenStartWith;
|
||||
|
||||
/**
|
||||
* 必须使用最少88位的Base64对该令牌进行编码
|
||||
*/
|
||||
@@ -41,8 +31,4 @@ public class SecurityProperties {
|
||||
* 续期时间
|
||||
*/
|
||||
private Long renew;
|
||||
|
||||
public String getTokenStartWith() {
|
||||
return tokenStartWith + " ";
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -4,7 +4,7 @@ import cn.odboy.application.core.context.JwtAccessDeniedHandler;
|
||||
import cn.odboy.application.core.context.JwtAuthenticationEntryPoint;
|
||||
import cn.odboy.application.core.context.TokenConfigurer;
|
||||
import cn.odboy.application.core.context.TokenProvider;
|
||||
import cn.odboy.application.core.service.impl.OnlineUserServiceImpl;
|
||||
import cn.odboy.application.core.service.impl.UserOnlineServiceImpl;
|
||||
import cn.odboy.constant.RequestMethodEnum;
|
||||
import cn.odboy.util.AnonTagUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@@ -36,7 +36,7 @@ public class SpringSecurityConfig {
|
||||
private final JwtAccessDeniedHandler jwtAccessDeniedHandler;
|
||||
private final ApplicationContext applicationContext;
|
||||
private final SecurityProperties securityProperties;
|
||||
private final OnlineUserServiceImpl onlineUserService;
|
||||
private final UserOnlineServiceImpl onlineUserService;
|
||||
|
||||
@Bean
|
||||
GrantedAuthorityDefaults grantedAuthorityDefaults() {
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
package cn.odboy.application.core.context;
|
||||
|
||||
import cn.odboy.application.core.config.SecurityProperties;
|
||||
import cn.odboy.application.core.service.impl.OnlineUserServiceImpl;
|
||||
import cn.odboy.application.core.service.impl.UserOnlineServiceImpl;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
|
||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||
@@ -13,7 +13,7 @@ public class TokenConfigurer extends SecurityConfigurerAdapter<DefaultSecurityFi
|
||||
|
||||
private final TokenProvider tokenProvider;
|
||||
private final SecurityProperties properties;
|
||||
private final OnlineUserServiceImpl onlineUserService;
|
||||
private final UserOnlineServiceImpl onlineUserService;
|
||||
|
||||
@Override
|
||||
public void configure(HttpSecurity http) {
|
||||
|
||||
+11
-9
@@ -2,8 +2,10 @@ package cn.odboy.application.core.context;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.odboy.application.core.config.SecurityProperties;
|
||||
import cn.odboy.application.core.service.impl.OnlineUserServiceImpl;
|
||||
import cn.odboy.model.system.dto.OnlineUserDto;
|
||||
import cn.odboy.application.core.service.impl.UserOnlineServiceImpl;
|
||||
import cn.odboy.constant.SystemConst;
|
||||
import cn.odboy.model.system.dto.UserOnlineDto;
|
||||
import cn.odboy.util.SecurityUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
@@ -22,14 +24,14 @@ public class TokenFilter extends GenericFilterBean {
|
||||
|
||||
private final TokenProvider tokenProvider;
|
||||
private final SecurityProperties properties;
|
||||
private final OnlineUserServiceImpl onlineUserService;
|
||||
private final UserOnlineServiceImpl onlineUserService;
|
||||
|
||||
/**
|
||||
* @param tokenProvider Token
|
||||
* @param properties JWT
|
||||
* @param onlineUserService 用户在线
|
||||
*/
|
||||
public TokenFilter(TokenProvider tokenProvider, SecurityProperties properties, OnlineUserServiceImpl onlineUserService) {
|
||||
public TokenFilter(TokenProvider tokenProvider, SecurityProperties properties, UserOnlineServiceImpl onlineUserService) {
|
||||
this.properties = properties;
|
||||
this.onlineUserService = onlineUserService;
|
||||
this.tokenProvider = tokenProvider;
|
||||
@@ -43,9 +45,9 @@ public class TokenFilter extends GenericFilterBean {
|
||||
if (StrUtil.isNotBlank(token)) {
|
||||
// 获取用户Token的Key
|
||||
String loginKey = tokenProvider.loginKey(token);
|
||||
OnlineUserDto onlineUserDto = onlineUserService.getOnlineUserByKey(loginKey);
|
||||
UserOnlineDto userOnlineDto = onlineUserService.getOnlineUserByKey(loginKey);
|
||||
// 判断用户在线信息是否为空
|
||||
if (onlineUserDto != null) {
|
||||
if (userOnlineDto != null) {
|
||||
// Token 续期判断
|
||||
tokenProvider.checkRenewal(token);
|
||||
// 获取认证信息,设置上下文
|
||||
@@ -63,10 +65,10 @@ public class TokenFilter extends GenericFilterBean {
|
||||
* @return /
|
||||
*/
|
||||
private String resolveToken(HttpServletRequest request) {
|
||||
String bearerToken = request.getHeader(properties.getHeader());
|
||||
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(properties.getTokenStartWith())) {
|
||||
String bearerToken = request.getHeader(SystemConst.HEADER_NAME);
|
||||
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(SystemConst.TOKEN_PREFIX)) {
|
||||
// 去掉令牌前缀
|
||||
return bearerToken.replace(properties.getTokenStartWith(), "");
|
||||
return bearerToken.replace(SystemConst.TOKEN_PREFIX + " ", "");
|
||||
} else {
|
||||
log.debug("非法Token:{}", bearerToken);
|
||||
}
|
||||
|
||||
+6
-4
@@ -4,9 +4,11 @@ import cn.hutool.core.date.DateField;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.odboy.application.core.config.SecurityProperties;
|
||||
import cn.odboy.constant.SystemConst;
|
||||
import cn.odboy.constant.SystemRedisKey;
|
||||
import cn.odboy.model.system.dto.JwtUserDto;
|
||||
import cn.odboy.model.system.dto.UserJwtDto;
|
||||
import cn.odboy.util.RedisUtil;
|
||||
import cn.odboy.util.SecurityUtil;
|
||||
import io.jsonwebtoken.*;
|
||||
import io.jsonwebtoken.io.Decoders;
|
||||
import io.jsonwebtoken.security.Keys;
|
||||
@@ -57,7 +59,7 @@ public class TokenProvider implements InitializingBean {
|
||||
* @param user /
|
||||
* @return /
|
||||
*/
|
||||
public String createToken(JwtUserDto user) {
|
||||
public String createToken(UserJwtDto user) {
|
||||
// 设置参数
|
||||
Map<String, Object> claims = new HashMap<>(6);
|
||||
// 设置用户ID
|
||||
@@ -106,8 +108,8 @@ public class TokenProvider implements InitializingBean {
|
||||
}
|
||||
|
||||
public String getToken(HttpServletRequest request) {
|
||||
final String requestHeader = request.getHeader(properties.getHeader());
|
||||
if (requestHeader != null && requestHeader.startsWith(properties.getTokenStartWith())) {
|
||||
final String requestHeader = request.getHeader(SystemConst.HEADER_NAME);
|
||||
if (requestHeader != null && requestHeader.startsWith(SystemConst.TOKEN_PREFIX)) {
|
||||
return requestHeader.substring(7);
|
||||
}
|
||||
return null;
|
||||
|
||||
+9
-9
@@ -6,8 +6,8 @@ import cn.odboy.application.system.service.RoleService;
|
||||
import cn.odboy.application.system.service.UserService;
|
||||
import cn.odboy.exception.BadRequestException;
|
||||
import cn.odboy.model.system.domain.User;
|
||||
import cn.odboy.model.system.dto.AuthorityDto;
|
||||
import cn.odboy.model.system.dto.JwtUserDto;
|
||||
import cn.odboy.model.system.dto.RoleCodeDto;
|
||||
import cn.odboy.model.system.dto.UserJwtDto;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||
@@ -25,9 +25,9 @@ public class UserDetailsHelper implements UserDetailsService {
|
||||
private final UserCacheService userCacheService;
|
||||
|
||||
@Override
|
||||
public JwtUserDto loadUserByUsername(String username) {
|
||||
JwtUserDto jwtUserDto = userCacheService.getUserCacheByUsername(username);
|
||||
if (jwtUserDto == null) {
|
||||
public UserJwtDto loadUserByUsername(String username) {
|
||||
UserJwtDto userJwtDto = userCacheService.getUserCacheByUsername(username);
|
||||
if (userJwtDto == null) {
|
||||
User user = userService.getUserByUsername(username);
|
||||
if (user == null) {
|
||||
throw new BadRequestException("用户不存在");
|
||||
@@ -36,13 +36,13 @@ public class UserDetailsHelper implements UserDetailsService {
|
||||
throw new BadRequestException("账号未激活!");
|
||||
}
|
||||
// 获取用户的权限
|
||||
List<AuthorityDto> authorities = roleService.buildPermissions(user);
|
||||
List<RoleCodeDto> authorities = roleService.buildPermissions(user);
|
||||
// 初始化JwtUserDto
|
||||
jwtUserDto = new JwtUserDto(user, dataService.selectDeptIdByUserIdWithDeptId(user), authorities);
|
||||
userJwtDto = new UserJwtDto(user, dataService.selectDeptIdByUserIdWithDeptId(user), authorities);
|
||||
// 添加缓存数据
|
||||
userCacheService.addUserCache(username, jwtUserDto);
|
||||
userCacheService.addUserCache(username, userJwtDto);
|
||||
}
|
||||
}
|
||||
return jwtUserDto;
|
||||
return userJwtDto;
|
||||
}
|
||||
}
|
||||
|
||||
+11
-10
@@ -10,14 +10,15 @@ import cn.odboy.application.core.config.SecurityProperties;
|
||||
import cn.odboy.application.core.constant.LoginCodeEnum;
|
||||
import cn.odboy.application.core.context.TokenProvider;
|
||||
import cn.odboy.application.core.context.UserDetailsHelper;
|
||||
import cn.odboy.application.core.service.impl.OnlineUserServiceImpl;
|
||||
import cn.odboy.application.core.service.impl.UserOnlineServiceImpl;
|
||||
import cn.odboy.constant.SystemConst;
|
||||
import cn.odboy.constant.SystemRedisKey;
|
||||
import cn.odboy.exception.BadRequestException;
|
||||
import cn.odboy.model.system.dto.AuthUserDto;
|
||||
import cn.odboy.model.system.dto.JwtUserDto;
|
||||
import cn.odboy.model.system.dto.UserAuthDto;
|
||||
import cn.odboy.model.system.dto.UserJwtDto;
|
||||
import cn.odboy.properties.RsaProperties;
|
||||
import cn.odboy.util.RedisUtil;
|
||||
import cn.odboy.util.RSAEncryptUtil;
|
||||
import cn.odboy.util.RedisUtil;
|
||||
import cn.odboy.util.SecurityUtil;
|
||||
import cn.odboy.util.StringUtil;
|
||||
import com.wf.captcha.base.Captcha;
|
||||
@@ -54,7 +55,7 @@ import java.util.concurrent.TimeUnit;
|
||||
public class AuthController {
|
||||
private final SecurityProperties properties;
|
||||
private final RedisUtil redisUtil;
|
||||
private final OnlineUserServiceImpl onlineUserService;
|
||||
private final UserOnlineServiceImpl onlineUserService;
|
||||
private final TokenProvider tokenProvider;
|
||||
private final CaptchaConfig captchaConfig;
|
||||
private final LoginProperties loginProperties;
|
||||
@@ -63,7 +64,7 @@ public class AuthController {
|
||||
|
||||
@ApiOperation("登录授权")
|
||||
@AnonymousPostMapping(value = "/login")
|
||||
public ResponseEntity<Object> login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception {
|
||||
public ResponseEntity<Object> login(@Validated @RequestBody UserAuthDto authUser, HttpServletRequest request) throws Exception {
|
||||
// 密码解密
|
||||
String password = RSAEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword());
|
||||
// 查询验证码
|
||||
@@ -77,7 +78,7 @@ public class AuthController {
|
||||
throw new BadRequestException("验证码错误");
|
||||
}
|
||||
// 获取用户信息
|
||||
JwtUserDto jwtUser = userDetailsService.loadUserByUsername(authUser.getUsername());
|
||||
UserJwtDto jwtUser = userDetailsService.loadUserByUsername(authUser.getUsername());
|
||||
// 验证用户密码
|
||||
if (!passwordEncoder.matches(password, jwtUser.getPassword())) {
|
||||
throw new BadRequestException("登录密码错误");
|
||||
@@ -87,8 +88,8 @@ public class AuthController {
|
||||
// 生成令牌
|
||||
String token = tokenProvider.createToken(jwtUser);
|
||||
// 返回 token 与 用户信息
|
||||
Map<String, Object> authInfo = new HashMap<String, Object>(2) {{
|
||||
put("token", properties.getTokenStartWith() + token);
|
||||
Map<String, Object> authInfo = new HashMap<>(2) {{
|
||||
put("token", String.format("%s %s", SystemConst.TOKEN_PREFIX, token));
|
||||
put("user", jwtUser);
|
||||
}};
|
||||
if (loginProperties.isSingleLogin()) {
|
||||
@@ -104,7 +105,7 @@ public class AuthController {
|
||||
@ApiOperation("获取用户信息")
|
||||
@GetMapping(value = "/info")
|
||||
public ResponseEntity<UserDetails> getUserInfo() {
|
||||
JwtUserDto jwtUser = (JwtUserDto) SecurityUtil.getCurrentUser();
|
||||
UserJwtDto jwtUser = (UserJwtDto) SecurityUtil.getCurrentUser();
|
||||
return ResponseEntity.ok(jwtUser);
|
||||
}
|
||||
|
||||
|
||||
+7
-7
@@ -1,8 +1,8 @@
|
||||
package cn.odboy.application.core.rest;
|
||||
|
||||
import cn.odboy.application.core.service.OnlineUserService;
|
||||
import cn.odboy.application.core.service.UserOnlineService;
|
||||
import cn.odboy.base.PageResult;
|
||||
import cn.odboy.model.system.dto.OnlineUserDto;
|
||||
import cn.odboy.model.system.dto.UserOnlineDto;
|
||||
import cn.odboy.util.DESEncryptUtil;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
@@ -23,20 +23,20 @@ import java.util.Set;
|
||||
@RequestMapping("/auth/online")
|
||||
@Api(tags = "系统:在线用户管理")
|
||||
public class OnlineController {
|
||||
private final OnlineUserService onlineUserService;
|
||||
private final UserOnlineService userOnlineService;
|
||||
|
||||
@ApiOperation("查询在线用户")
|
||||
@GetMapping
|
||||
@PreAuthorize("@el.check()")
|
||||
public ResponseEntity<PageResult<OnlineUserDto>> queryOnlineUser(String username, Pageable pageable) {
|
||||
return new ResponseEntity<>(onlineUserService.queryOnlineUserPage(username, pageable), HttpStatus.OK);
|
||||
public ResponseEntity<PageResult<UserOnlineDto>> queryOnlineUser(String username, Pageable pageable) {
|
||||
return new ResponseEntity<>(userOnlineService.queryOnlineUserPage(username, pageable), HttpStatus.OK);
|
||||
}
|
||||
|
||||
@ApiOperation("导出数据")
|
||||
@GetMapping(value = "/download")
|
||||
@PreAuthorize("@el.check()")
|
||||
public void exportOnlineUser(HttpServletResponse response, String username) throws IOException {
|
||||
onlineUserService.downloadExcel(onlineUserService.selectOnlineUserByUsername(username), response);
|
||||
userOnlineService.downloadExcel(userOnlineService.selectOnlineUserByUsername(username), response);
|
||||
}
|
||||
|
||||
@ApiOperation("踢出用户")
|
||||
@@ -46,7 +46,7 @@ public class OnlineController {
|
||||
for (String token : keys) {
|
||||
// 解密Key
|
||||
token = DESEncryptUtil.desDecrypt(token);
|
||||
onlineUserService.logoutByToken(token);
|
||||
userOnlineService.logoutByToken(token);
|
||||
}
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
}
|
||||
|
||||
+4
-4
@@ -1,6 +1,6 @@
|
||||
package cn.odboy.application.core.service;
|
||||
|
||||
import cn.odboy.model.system.dto.JwtUserDto;
|
||||
import cn.odboy.model.system.dto.UserJwtDto;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
|
||||
public interface UserCacheService {
|
||||
@@ -8,9 +8,9 @@ public interface UserCacheService {
|
||||
* 返回用户缓存
|
||||
*
|
||||
* @param username 用户名
|
||||
* @return JwtUserDto
|
||||
* @return UserJwtDto
|
||||
*/
|
||||
JwtUserDto getUserCacheByUsername(String username);
|
||||
UserJwtDto getUserCacheByUsername(String username);
|
||||
|
||||
/**
|
||||
* 添加缓存到Redis
|
||||
@@ -18,7 +18,7 @@ public interface UserCacheService {
|
||||
* @param userName 用户名
|
||||
*/
|
||||
@Async
|
||||
void addUserCache(String userName, JwtUserDto user);
|
||||
void addUserCache(String userName, UserJwtDto user);
|
||||
|
||||
/**
|
||||
* 清理用户缓存信息
|
||||
|
||||
+9
-9
@@ -1,8 +1,8 @@
|
||||
package cn.odboy.application.core.service;
|
||||
|
||||
import cn.odboy.base.PageResult;
|
||||
import cn.odboy.model.system.dto.JwtUserDto;
|
||||
import cn.odboy.model.system.dto.OnlineUserDto;
|
||||
import cn.odboy.model.system.dto.UserJwtDto;
|
||||
import cn.odboy.model.system.dto.UserOnlineDto;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
@@ -10,15 +10,15 @@ import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
public interface OnlineUserService {
|
||||
public interface UserOnlineService {
|
||||
/**
|
||||
* 保存在线用户信息
|
||||
*
|
||||
* @param jwtUserDto /
|
||||
* @param userJwtDto /
|
||||
* @param token /
|
||||
* @param request /
|
||||
*/
|
||||
void save(JwtUserDto jwtUserDto, String token, HttpServletRequest request);
|
||||
void save(UserJwtDto userJwtDto, String token, HttpServletRequest request);
|
||||
|
||||
/**
|
||||
* 查询全部数据
|
||||
@@ -27,7 +27,7 @@ public interface OnlineUserService {
|
||||
* @param pageable /
|
||||
* @return /
|
||||
*/
|
||||
PageResult<OnlineUserDto> queryOnlineUserPage(String username, Pageable pageable);
|
||||
PageResult<UserOnlineDto> queryOnlineUserPage(String username, Pageable pageable);
|
||||
|
||||
/**
|
||||
* 查询全部数据,不分页
|
||||
@@ -35,7 +35,7 @@ public interface OnlineUserService {
|
||||
* @param username /
|
||||
* @return /
|
||||
*/
|
||||
List<OnlineUserDto> selectOnlineUserByUsername(String username);
|
||||
List<UserOnlineDto> selectOnlineUserByUsername(String username);
|
||||
|
||||
/**
|
||||
* 退出登录
|
||||
@@ -51,7 +51,7 @@ public interface OnlineUserService {
|
||||
* @param response /
|
||||
* @throws IOException /
|
||||
*/
|
||||
void downloadExcel(List<OnlineUserDto> all, HttpServletResponse response) throws IOException;
|
||||
void downloadExcel(List<UserOnlineDto> all, HttpServletResponse response) throws IOException;
|
||||
|
||||
/**
|
||||
* 查询用户
|
||||
@@ -59,7 +59,7 @@ public interface OnlineUserService {
|
||||
* @param key /
|
||||
* @return /
|
||||
*/
|
||||
OnlineUserDto getOnlineUserByKey(String key);
|
||||
UserOnlineDto getOnlineUserByKey(String key);
|
||||
|
||||
/**
|
||||
* 根据用户名强退用户
|
||||
+4
-4
@@ -3,7 +3,7 @@ package cn.odboy.application.core.service.impl;
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.odboy.application.core.config.LoginProperties;
|
||||
import cn.odboy.application.core.service.UserCacheService;
|
||||
import cn.odboy.model.system.dto.JwtUserDto;
|
||||
import cn.odboy.model.system.dto.UserJwtDto;
|
||||
import cn.odboy.util.RedisUtil;
|
||||
import cn.odboy.util.StringUtil;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -19,19 +19,19 @@ public class UserCacheServiceImpl implements UserCacheService {
|
||||
private RedisUtil redisUtil;
|
||||
|
||||
@Override
|
||||
public JwtUserDto getUserCacheByUsername(String username) {
|
||||
public UserJwtDto getUserCacheByUsername(String username) {
|
||||
// 转小写
|
||||
username = StringUtil.lowerCase(username);
|
||||
if (StringUtil.isNotEmpty(username)) {
|
||||
// 获取数据
|
||||
return redisUtil.get(LoginProperties.cacheKey + username, JwtUserDto.class);
|
||||
return redisUtil.get(LoginProperties.cacheKey + username, UserJwtDto.class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void addUserCache(String userName, JwtUserDto user) {
|
||||
public void addUserCache(String userName, UserJwtDto user) {
|
||||
// 转小写
|
||||
userName = StringUtil.lowerCase(userName);
|
||||
if (StringUtil.isNotEmpty(userName)) {
|
||||
|
||||
+28
-28
@@ -2,11 +2,11 @@ package cn.odboy.application.core.service.impl;
|
||||
|
||||
import cn.odboy.application.core.config.SecurityProperties;
|
||||
import cn.odboy.application.core.context.TokenProvider;
|
||||
import cn.odboy.application.core.service.OnlineUserService;
|
||||
import cn.odboy.application.core.service.UserOnlineService;
|
||||
import cn.odboy.base.PageResult;
|
||||
import cn.odboy.constant.SystemRedisKey;
|
||||
import cn.odboy.model.system.dto.JwtUserDto;
|
||||
import cn.odboy.model.system.dto.OnlineUserDto;
|
||||
import cn.odboy.model.system.dto.UserJwtDto;
|
||||
import cn.odboy.model.system.dto.UserOnlineDto;
|
||||
import cn.odboy.util.*;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -23,52 +23,52 @@ import java.util.concurrent.TimeUnit;
|
||||
@Service
|
||||
@Slf4j
|
||||
@AllArgsConstructor
|
||||
public class OnlineUserServiceImpl implements OnlineUserService {
|
||||
public class UserOnlineServiceImpl implements UserOnlineService {
|
||||
private final SecurityProperties properties;
|
||||
private final TokenProvider tokenProvider;
|
||||
private final RedisUtil redisUtil;
|
||||
|
||||
@Override
|
||||
public void save(JwtUserDto jwtUserDto, String token, HttpServletRequest request) {
|
||||
String dept = jwtUserDto.getUser().getDept().getName();
|
||||
public void save(UserJwtDto userJwtDto, String token, HttpServletRequest request) {
|
||||
String dept = userJwtDto.getUser().getDept().getName();
|
||||
String ip = BrowserUtil.getIp(request);
|
||||
String id = tokenProvider.getId(token);
|
||||
String version = BrowserUtil.getVersion(request);
|
||||
String address = IPUtil.getCityInfo(ip);
|
||||
OnlineUserDto onlineUserDto = null;
|
||||
UserOnlineDto userOnlineDto = null;
|
||||
try {
|
||||
onlineUserDto = new OnlineUserDto();
|
||||
onlineUserDto.setUid(id);
|
||||
onlineUserDto.setUserName(jwtUserDto.getUsername());
|
||||
onlineUserDto.setNickName(jwtUserDto.getUser().getNickName());
|
||||
onlineUserDto.setDept(dept);
|
||||
onlineUserDto.setBrowser(version);
|
||||
onlineUserDto.setIp(ip);
|
||||
onlineUserDto.setAddress(address);
|
||||
onlineUserDto.setKey(DESEncryptUtil.desEncrypt(token));
|
||||
onlineUserDto.setLoginTime(new Date());
|
||||
userOnlineDto = new UserOnlineDto();
|
||||
userOnlineDto.setUid(id);
|
||||
userOnlineDto.setUserName(userJwtDto.getUsername());
|
||||
userOnlineDto.setNickName(userJwtDto.getUser().getNickName());
|
||||
userOnlineDto.setDept(dept);
|
||||
userOnlineDto.setBrowser(version);
|
||||
userOnlineDto.setIp(ip);
|
||||
userOnlineDto.setAddress(address);
|
||||
userOnlineDto.setKey(DESEncryptUtil.desEncrypt(token));
|
||||
userOnlineDto.setLoginTime(new Date());
|
||||
} catch (Exception e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
String loginKey = tokenProvider.loginKey(token);
|
||||
redisUtil.set(loginKey, onlineUserDto, properties.getTokenValidityInSeconds(), TimeUnit.MILLISECONDS);
|
||||
redisUtil.set(loginKey, userOnlineDto, properties.getTokenValidityInSeconds(), TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<OnlineUserDto> queryOnlineUserPage(String username, Pageable pageable) {
|
||||
List<OnlineUserDto> onlineUserList = selectOnlineUserByUsername(username);
|
||||
List<OnlineUserDto> paging = PageUtil.softPaging(pageable.getPageNumber(), pageable.getPageSize(), onlineUserList);
|
||||
public PageResult<UserOnlineDto> queryOnlineUserPage(String username, Pageable pageable) {
|
||||
List<UserOnlineDto> onlineUserList = selectOnlineUserByUsername(username);
|
||||
List<UserOnlineDto> paging = PageUtil.softPaging(pageable.getPageNumber(), pageable.getPageSize(), onlineUserList);
|
||||
return PageUtil.toPage(paging, onlineUserList.size());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<OnlineUserDto> selectOnlineUserByUsername(String username) {
|
||||
public List<UserOnlineDto> selectOnlineUserByUsername(String username) {
|
||||
String loginKey = SystemRedisKey.ONLINE_USER + (StringUtil.isBlank(username) ? "" : "*" + username);
|
||||
List<String> keys = redisUtil.scan(loginKey + "*");
|
||||
Collections.reverse(keys);
|
||||
List<OnlineUserDto> onlineUserList = new ArrayList<>();
|
||||
List<UserOnlineDto> onlineUserList = new ArrayList<>();
|
||||
for (String key : keys) {
|
||||
onlineUserList.add(redisUtil.get(key, OnlineUserDto.class));
|
||||
onlineUserList.add(redisUtil.get(key, UserOnlineDto.class));
|
||||
}
|
||||
onlineUserList.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime()));
|
||||
return onlineUserList;
|
||||
@@ -81,9 +81,9 @@ public class OnlineUserServiceImpl implements OnlineUserService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void downloadExcel(List<OnlineUserDto> all, HttpServletResponse response) throws IOException {
|
||||
public void downloadExcel(List<UserOnlineDto> all, HttpServletResponse response) throws IOException {
|
||||
List<Map<String, Object>> list = new ArrayList<>();
|
||||
for (OnlineUserDto user : all) {
|
||||
for (UserOnlineDto user : all) {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("用户名", user.getUserName());
|
||||
map.put("部门", user.getDept());
|
||||
@@ -97,8 +97,8 @@ public class OnlineUserServiceImpl implements OnlineUserService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public OnlineUserDto getOnlineUserByKey(String key) {
|
||||
return redisUtil.get(key, OnlineUserDto.class);
|
||||
public UserOnlineDto getOnlineUserByKey(String key) {
|
||||
return redisUtil.get(key, UserOnlineDto.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
+2
-2
@@ -3,7 +3,7 @@ package cn.odboy.application.system.service;
|
||||
import cn.odboy.base.PageResult;
|
||||
import cn.odboy.model.system.domain.Role;
|
||||
import cn.odboy.model.system.domain.User;
|
||||
import cn.odboy.model.system.dto.AuthorityDto;
|
||||
import cn.odboy.model.system.dto.RoleCodeDto;
|
||||
import cn.odboy.model.system.dto.RoleQueryCriteria;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
@@ -98,7 +98,7 @@ public interface RoleService extends IService<Role> {
|
||||
* @param user 用户信息
|
||||
* @return 权限信息
|
||||
*/
|
||||
List<AuthorityDto> buildPermissions(User user);
|
||||
List<RoleCodeDto> buildPermissions(User user);
|
||||
|
||||
/**
|
||||
* 导出数据
|
||||
|
||||
+4
-4
@@ -3,9 +3,9 @@ package cn.odboy.application.system.service.impl;
|
||||
import cn.hutool.core.date.BetweenFormatter.Level;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.odboy.application.system.service.MonitorService;
|
||||
import cn.odboy.constant.SystemConstant;
|
||||
import cn.odboy.constant.SystemConst;
|
||||
import cn.odboy.util.FileUtil;
|
||||
import cn.odboy.util.StringUtil;
|
||||
import cn.odboy.util.IPUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import oshi.SystemInfo;
|
||||
@@ -65,7 +65,7 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
long available = 0, total = 0;
|
||||
for (OSFileStore fs : fsArray) {
|
||||
// windows 需要将所有磁盘分区累加,linux 和 mac 直接累加会出现磁盘重复的问题,待修复
|
||||
if (osName.toLowerCase().startsWith(SystemConstant.WIN)) {
|
||||
if (osName.toLowerCase().startsWith(SystemConst.WIN)) {
|
||||
available += fs.getUsableSpace();
|
||||
total += fs.getTotalSpace();
|
||||
} else {
|
||||
@@ -178,7 +178,7 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
// 系统信息
|
||||
systemInfo.put("os", os.toString());
|
||||
systemInfo.put("day", formatBetween);
|
||||
systemInfo.put("ip", StringUtil.getLocalIp());
|
||||
systemInfo.put("ip", IPUtil.getLocalIp());
|
||||
return systemInfo;
|
||||
}
|
||||
}
|
||||
|
||||
+5
-5
@@ -15,7 +15,7 @@ import cn.odboy.exception.EntityExistException;
|
||||
import cn.odboy.model.system.domain.Menu;
|
||||
import cn.odboy.model.system.domain.Role;
|
||||
import cn.odboy.model.system.domain.User;
|
||||
import cn.odboy.model.system.dto.AuthorityDto;
|
||||
import cn.odboy.model.system.dto.RoleCodeDto;
|
||||
import cn.odboy.model.system.dto.RoleQueryCriteria;
|
||||
import cn.odboy.util.FileUtil;
|
||||
import cn.odboy.util.PageUtil;
|
||||
@@ -160,22 +160,22 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<AuthorityDto> buildPermissions(User user) {
|
||||
public List<RoleCodeDto> buildPermissions(User user) {
|
||||
String key = SystemRedisKey.ROLE_AUTH + user.getId();
|
||||
List<AuthorityDto> authorityList = redisUtil.getList(key, AuthorityDto.class);
|
||||
List<RoleCodeDto> authorityList = redisUtil.getList(key, RoleCodeDto.class);
|
||||
if (CollUtil.isEmpty(authorityList)) {
|
||||
Set<String> permissions = new HashSet<>();
|
||||
// 如果是管理员直接返回
|
||||
if (user.getIsAdmin()) {
|
||||
permissions.add("admin");
|
||||
return permissions.stream().map(AuthorityDto::new)
|
||||
return permissions.stream().map(RoleCodeDto::new)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
List<Role> roles = roleMapper.selectRoleByUserId(user.getId());
|
||||
permissions = roles.stream().flatMap(role -> role.getMenus().stream())
|
||||
.map(Menu::getPermission)
|
||||
.filter(StringUtil::isNotBlank).collect(Collectors.toSet());
|
||||
authorityList = permissions.stream().map(AuthorityDto::new)
|
||||
authorityList = permissions.stream().map(RoleCodeDto::new)
|
||||
.collect(Collectors.toList());
|
||||
redisUtil.set(key, authorityList, 1, TimeUnit.HOURS);
|
||||
}
|
||||
|
||||
+4
-4
@@ -1,6 +1,6 @@
|
||||
package cn.odboy.application.system.service.impl;
|
||||
|
||||
import cn.odboy.application.core.service.OnlineUserService;
|
||||
import cn.odboy.application.core.service.UserOnlineService;
|
||||
import cn.odboy.application.core.service.UserCacheService;
|
||||
import cn.odboy.application.system.mapper.UserJobMapper;
|
||||
import cn.odboy.application.system.mapper.UserMapper;
|
||||
@@ -40,7 +40,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
|
||||
private final FileProperties fileProperties;
|
||||
private final RedisUtil redisUtil;
|
||||
private final UserCacheService userCacheService;
|
||||
private final OnlineUserService onlineUserService;
|
||||
private final UserOnlineService userOnlineService;
|
||||
|
||||
@Override
|
||||
public PageResult<User> queryUserPage(UserQueryCriteria criteria, Page<Object> page) {
|
||||
@@ -116,7 +116,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
|
||||
}
|
||||
// 如果用户被禁用,则清除用户登录信息
|
||||
if (!resources.getEnabled()) {
|
||||
onlineUserService.kickOutByUsername(resources.getUsername());
|
||||
userOnlineService.kickOutByUsername(resources.getUsername());
|
||||
}
|
||||
user.setDeptId(resources.getDept().getId());
|
||||
user.setUsername(resources.getUsername());
|
||||
@@ -191,7 +191,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
|
||||
// 清除缓存
|
||||
flushCache(user.getUsername());
|
||||
// 强制退出
|
||||
onlineUserService.kickOutByUsername(user.getUsername());
|
||||
userOnlineService.kickOutByUsername(user.getUsername());
|
||||
});
|
||||
// 重置密码
|
||||
userMapper.resetPasswordByUserIds(ids, password);
|
||||
|
||||
Reference in New Issue
Block a user