sakuya 3 gadi atpakaļ
vecāks
revīzija
aa10c0d1a3
19 mainītis faili ar 290 papildinājumiem un 211 dzēšanām
  1. 48 0
      eladmin-security/pom.xml
  2. 3 3
      eladmin-system/src/main/java/me/zhengjie/modules/security/config/ConfigBeanConfiguration.java
  3. 9 10
      eladmin-system/src/main/java/me/zhengjie/modules/security/config/SpringSecurityConfig.java
  4. 1 1
      eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginCode.java
  5. 1 1
      eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginCodeEnum.java
  6. 1 1
      eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginProperties.java
  7. 1 3
      eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/SecurityProperties.java
  8. 1 1
      eladmin-system/src/main/java/me/zhengjie/modules/security/error/SystemErrorController.java
  9. 25 59
      eladmin-system/src/main/java/me/zhengjie/modules/security/rest/AuthorizationController.java
  10. 3 2
      eladmin-system/src/main/java/me/zhengjie/modules/security/rest/OnlineController.java
  11. 3 2
      eladmin-system/src/main/java/me/zhengjie/modules/security/service/dto/AuthUserDto.java
  12. 1 2
      eladmin-system/src/main/java/me/zhengjie/modules/security/security/JwtAccessDeniedHandler.java
  13. 5 7
      eladmin-system/src/main/java/me/zhengjie/modules/security/security/JjwtAppUtil.java
  14. 4 7
      eladmin-system/src/main/java/me/zhengjie/modules/security/security/JwtAuthenticationEntryPoint.java
  15. 4 6
      eladmin-system/src/main/java/me/zhengjie/modules/security/security/TokenConfigurer.java
  16. 52 56
      eladmin-system/src/main/java/me/zhengjie/modules/security/security/TokenFilter.java
  17. 6 5
      eladmin-system/src/main/java/me/zhengjie/modules/security/security/TokenProvider.java
  18. 50 45
      eladmin-system/src/main/java/me/zhengjie/modules/security/service/OnlineUserService.java
  19. 72 0
      eladmin-security/src/main/java/me/zhengjie/security/service/dto/OnlineUserDto.java

+ 48 - 0
eladmin-security/pom.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>eladmin</artifactId>
+        <groupId>me.zhengjie</groupId>
+        <version>2.6</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>eladmin-security</artifactId>
+    <name>权限模块</name>
+
+    <properties>
+        <jjwt.version>0.11.1</jjwt.version>
+        <gson.version>2.9.0</gson.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>me.zhengjie</groupId>
+            <artifactId>eladmin-common</artifactId>
+            <version>2.6</version>
+        </dependency>
+        <!-- jwt -->
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-api</artifactId>
+            <version>${jjwt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-impl</artifactId>
+            <version>${jjwt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-jackson</artifactId>
+            <version>${jjwt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>${gson.version}</version>
+        </dependency>
+    </dependencies>
+</project>

+ 3 - 3
eladmin-system/src/main/java/me/zhengjie/modules/security/config/ConfigBeanConfiguration.java

@@ -13,10 +13,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package me.zhengjie.modules.security.config;
+package me.zhengjie.security.config;
 
-import me.zhengjie.modules.security.config.bean.LoginProperties;
-import me.zhengjie.modules.security.config.bean.SecurityProperties;
+import me.zhengjie.security.config.bean.LoginProperties;
+import me.zhengjie.security.config.bean.SecurityProperties;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;

+ 9 - 10
eladmin-system/src/main/java/me/zhengjie/modules/security/config/SpringSecurityConfig.java

@@ -13,14 +13,15 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package me.zhengjie.modules.security.config;
+package me.zhengjie.security.config;
 
 import lombok.RequiredArgsConstructor;
 import me.zhengjie.annotation.AnonymousAccess;
-import me.zhengjie.modules.security.config.bean.SecurityProperties;
-import me.zhengjie.modules.security.security.*;
-import me.zhengjie.modules.security.service.OnlineUserService;
-import me.zhengjie.modules.security.service.UserCacheClean;
+import me.zhengjie.security.config.bean.SecurityProperties;
+import me.zhengjie.security.security.TokenConfigurer;
+import me.zhengjie.security.security.TokenFilter;
+import me.zhengjie.security.security.TokenProvider;
+import me.zhengjie.security.service.OnlineUserService;
 import me.zhengjie.utils.enums.RequestMethodEnum;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Bean;
@@ -40,6 +41,7 @@ import org.springframework.web.filter.CorsFilter;
 import org.springframework.web.method.HandlerMethod;
 import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
 import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
+
 import java.util.*;
 
 /**
@@ -58,7 +60,6 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
     private final ApplicationContext applicationContext;
     private final SecurityProperties properties;
     private final OnlineUserService onlineUserService;
-    private final UserCacheClean userCacheClean;
 
     @Bean
     GrantedAuthorityDefaults grantedAuthorityDefaults() {
@@ -145,14 +146,13 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
                 // 所有请求都需要认证
                 .anyRequest().authenticated()
                 .and().apply(securityConfigurerAdapter());
-        		//设置所有的不需要权限访问的
+                //设置所有的不需要权限访问的
                 TokenFilter.setAnonymousUrl(anonymousUrls);
-        
                 System.out.println(anonymousUrls);
     }
 
     private TokenConfigurer securityConfigurerAdapter() {
-        return new TokenConfigurer(tokenProvider, properties, onlineUserService, userCacheClean);
+        return new TokenConfigurer(tokenProvider, properties, onlineUserService);
     }
 
     private Map<String, Set<String>> getAnonymousUrl(Map<RequestMappingInfo, HandlerMethod> handlerMethodMap) {
@@ -199,5 +199,4 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
         anonymousUrls.put(RequestMethodEnum.ALL.getType(), all);
         return anonymousUrls;
     }
-    
 }

+ 1 - 1
eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginCode.java

@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package me.zhengjie.modules.security.config.bean;
+package me.zhengjie.security.config.bean;
 
 import lombok.Data;
 

+ 1 - 1
eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginCodeEnum.java

@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package me.zhengjie.modules.security.config.bean;
+package me.zhengjie.security.config.bean;
 
 /**
  * 验证码配置枚举

+ 1 - 1
eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginProperties.java

@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package me.zhengjie.modules.security.config.bean;
+package me.zhengjie.security.config.bean;
 
 import com.wf.captcha.*;
 import com.wf.captcha.base.Captcha;

+ 1 - 3
eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/SecurityProperties.java

@@ -13,9 +13,7 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package me.zhengjie.modules.security.config.bean;
-
-import javax.annotation.PostConstruct;
+package me.zhengjie.security.config.bean;
 
 import lombok.Data;
 

+ 1 - 1
eladmin-system/src/main/java/me/zhengjie/modules/security/error/SystemErrorController.java

@@ -1,4 +1,4 @@
-package me.zhengjie.modules.security.error;
+package me.zhengjie.security.error;
 
 import lombok.extern.slf4j.Slf4j;
 import me.zhengjie.base.ResponseDTO;

+ 25 - 59
eladmin-system/src/main/java/me/zhengjie/modules/security/rest/AuthorizationController.java

@@ -13,7 +13,7 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package me.zhengjie.modules.security.rest;
+package me.zhengjie.security.rest;
 
 import cn.hutool.core.util.IdUtil;
 import com.wf.captcha.base.Captcha;
@@ -23,24 +23,15 @@ import lombok.RequiredArgsConstructor;
 import me.zhengjie.annotation.rest.AnonymousDeleteMapping;
 import me.zhengjie.annotation.rest.AnonymousGetMapping;
 import me.zhengjie.annotation.rest.AnonymousPostMapping;
-import me.zhengjie.dao.mybatis.entity.FileInfoEntity;
-import me.zhengjie.application.bank.service.FileInfoService;
-import me.zhengjie.base.util.FileUploadUtil;
 import me.zhengjie.config.RsaProperties;
-import me.zhengjie.modules.security.config.bean.LoginCodeEnum;
-import me.zhengjie.modules.security.config.bean.LoginProperties;
-import me.zhengjie.modules.security.config.bean.SecurityProperties;
-import me.zhengjie.modules.security.security.TokenProvider;
-import me.zhengjie.modules.security.service.dto.AuthUserDto;
-import me.zhengjie.modules.security.service.dto.JwtUserDto;
-import me.zhengjie.application.admin.service.UserService;
-import me.zhengjie.application.admin.service.dto.UserDto;
-import me.zhengjie.modules.security.service.OnlineUserService;
-import me.zhengjie.utils.RsaUtils;
+import me.zhengjie.security.config.bean.LoginCodeEnum;
+import me.zhengjie.security.config.bean.LoginProperties;
+import me.zhengjie.security.config.bean.SecurityProperties;
+import me.zhengjie.security.rest.vo.AuthUserVO;
+import me.zhengjie.security.security.TokenProvider;
+import me.zhengjie.security.service.OnlineUserService;
 import me.zhengjie.utils.RedisUtils;
-import me.zhengjie.utils.SecurityUtils;
-
-import org.springframework.beans.factory.annotation.Autowired;
+import me.zhengjie.utils.RsaUtils;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -48,7 +39,10 @@ import org.springframework.security.config.annotation.authentication.builders.Au
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.util.HashMap;
@@ -71,27 +65,23 @@ public class AuthorizationController {
 	private final AuthenticationManagerBuilder authenticationManagerBuilder;
 	@Resource
 	private LoginProperties loginProperties;
-	// 用户的信息
-	private final UserService userService;
-	@Autowired
-	private FileInfoService fileInfoService;
 
 	@ApiOperation("登录授权")
 	@AnonymousPostMapping(value = "/login")
-	public ResponseEntity<Object> login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request)
+	public ResponseEntity<Object> login(@Validated @RequestBody AuthUserVO authUser, HttpServletRequest request)
 			throws Exception {
 		// 密码解密
 		String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword());
 		// 查询验证码
-//        String code = (String) redisUtils.get(authUser.getUuid());
-//        // 清除验证码
-////        redisUtils.del(authUser.getUuid());
-//        if (StringUtils.isBlank(code)) {
-//            throw new BadRequestException("验证码不存在或已过期");
-//        }
-//        if (StringUtils.isBlank(authUser.getCode()) || !authUser.getCode().equalsIgnoreCase(code)) {
-//            throw new BadRequestException("验证码错误");
-//        }
+		// String code = (String) redisUtils.get(authUser.getUuid());
+		// 清除验证码
+		// redisUtils.del(authUser.getUuid());
+		// if (StringUtils.isBlank(code)) {
+		//  throw new BadRequestException("验证码不存在或已过期");
+		// }
+		// if (StringUtils.isBlank(authUser.getCode()) || !authUser.getCode().equalsIgnoreCase(code)) {
+		// throw new BadRequestException("验证码错误");
+		// }
 		UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
 				authUser.getUsername(), password);
 		//
@@ -105,17 +95,15 @@ public class AuthorizationController {
 		// userDetails.getAuthorities());
 		// SecurityContextHolder.getContext().setAuthentication(authentication);
 		String token = tokenProvider.createToken(authentication);
-		final JwtUserDto jwtUserDto = (JwtUserDto) authentication.getPrincipal();
 		// 保存在线信息
-		// 这里先看一下日志
-		System.out.println("开始保存数据--onlineUserService.save---");
-		onlineUserService.save(jwtUserDto, token, request);
+		Object securityContextUser = authentication.getPrincipal();
+		onlineUserService.save(securityContextUser, token, request);
 		// 返回 token 与 用户信息
 		Map<String, Object> authInfo = new HashMap<String, Object>(2) {
 			private static final long serialVersionUID = 1L;
 			{
 				put("token", properties.getTokenStartWith() + token);
-				put("user", jwtUserDto);
+				put("user", securityContextUser);
 			}
 		};
 
@@ -126,28 +114,6 @@ public class AuthorizationController {
 		return ResponseEntity.ok(authInfo);
 	}
 
-	@ApiOperation("获取用户信息")
-	@GetMapping(value = "/info")
-	public ResponseEntity<Object> getUserInfo() {
-		// 这里需要处理图片显示问题
-		JwtUserDto jwtUserDto = (JwtUserDto) SecurityUtils.getCurrentUser();
-		// 处理图片的显示,重新查询一下当前的用户的值
-		UserDto cacheUser = jwtUserDto.getUser();
-		UserDto user = userService.findUserNoCacheId(cacheUser.getId());
-		if (user != null) {
-			FileInfoEntity fileInfo = fileInfoService.getById(user.getSignImgId());
-			if (fileInfo != null) {
-				String signImgUrl = FileUploadUtil.getFileUrl(fileInfo.getPath());
-				cacheUser.setSignImgUrl(signImgUrl);
-			}else {
-				//这里需要设置图片的路径为空
-				cacheUser.setSignImgUrl("");
-			}
-
-		}
-		return ResponseEntity.ok(jwtUserDto);
-	}
-
 	@ApiOperation("获取验证码")
 	@AnonymousGetMapping(value = "/code")
 	public ResponseEntity<Object> getCode() {

+ 3 - 2
eladmin-system/src/main/java/me/zhengjie/modules/security/rest/OnlineController.java

@@ -13,18 +13,19 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package me.zhengjie.modules.security.rest;
+package me.zhengjie.security.rest;
 
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
-import me.zhengjie.modules.security.service.OnlineUserService;
+import me.zhengjie.security.service.OnlineUserService;
 import me.zhengjie.utils.EncryptUtils;
 import org.springframework.data.domain.Pageable;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
+
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.Set;

+ 3 - 2
eladmin-system/src/main/java/me/zhengjie/modules/security/service/dto/AuthUserDto.java

@@ -13,10 +13,11 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package me.zhengjie.modules.security.service.dto;
+package me.zhengjie.security.rest.vo;
 
 import lombok.Getter;
 import lombok.Setter;
+
 import javax.validation.constraints.NotBlank;
 
 /**
@@ -25,7 +26,7 @@ import javax.validation.constraints.NotBlank;
  */
 @Getter
 @Setter
-public class AuthUserDto {
+public class AuthUserVO {
 
     @NotBlank
     private String username;

+ 1 - 2
eladmin-system/src/main/java/me/zhengjie/modules/security/security/JwtAccessDeniedHandler.java

@@ -13,11 +13,10 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package me.zhengjie.modules.security.security;
+package me.zhengjie.security.security;
 
 import org.springframework.security.access.AccessDeniedException;
 import org.springframework.security.web.access.AccessDeniedHandler;
-import org.springframework.stereotype.Component;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;

+ 5 - 7
eladmin-system/src/main/java/me/zhengjie/modules/security/security/JjwtAppUtil.java

@@ -1,23 +1,21 @@
-package me.zhengjie.modules.security.security;
+package me.zhengjie.security.security;
 
 
-import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
-
-import org.apache.tomcat.util.codec.binary.Base64;
-
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.JwtBuilder;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
+import org.apache.tomcat.util.codec.binary.Base64;
 
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
 // 使用io.jsonwebtoken包
-public class JjwtAppUtil {
+public class JwtAppUtil {
 
 	// jti:jwt的唯一身份标识
 	public static final String JWT_ID = UUID.randomUUID().toString();

+ 4 - 7
eladmin-system/src/main/java/me/zhengjie/modules/security/security/JwtAuthenticationEntryPoint.java

@@ -13,22 +13,19 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package me.zhengjie.modules.security.security;
+package me.zhengjie.security.security;
 
+import lombok.extern.slf4j.Slf4j;
+import me.zhengjie.base.ResponseDTO;
+import me.zhengjie.base.ResultCode;
 import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController;
 import org.springframework.boot.web.servlet.error.ErrorAttributes;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.web.AuthenticationEntryPoint;
-import org.springframework.stereotype.Component;
-import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
-import lombok.extern.slf4j.Slf4j;
-import me.zhengjie.base.ResponseDTO;
-import me.zhengjie.base.ResultCode;
-
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;

+ 4 - 6
eladmin-system/src/main/java/me/zhengjie/modules/security/security/TokenConfigurer.java

@@ -13,12 +13,11 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package me.zhengjie.modules.security.security;
+package me.zhengjie.security.security;
 
 import lombok.RequiredArgsConstructor;
-import me.zhengjie.modules.security.config.bean.SecurityProperties;
-import me.zhengjie.modules.security.service.OnlineUserService;
-import me.zhengjie.modules.security.service.UserCacheClean;
+import me.zhengjie.security.config.bean.SecurityProperties;
+import me.zhengjie.security.service.OnlineUserService;
 import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.web.DefaultSecurityFilterChain;
@@ -33,11 +32,10 @@ public class TokenConfigurer extends SecurityConfigurerAdapter<DefaultSecurityFi
     private final TokenProvider tokenProvider;
     private final SecurityProperties properties;
     private final OnlineUserService onlineUserService;
-    private final UserCacheClean userCacheClean;
 
     @Override
     public void configure(HttpSecurity http) {
-        TokenFilter customFilter = new TokenFilter(tokenProvider, properties, onlineUserService, userCacheClean);
+        TokenFilter customFilter = new TokenFilter(tokenProvider, properties, onlineUserService);
          
         http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);
     }

+ 52 - 56
eladmin-system/src/main/java/me/zhengjie/modules/security/security/TokenFilter.java

@@ -13,14 +13,25 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package me.zhengjie.modules.security.security;
+package me.zhengjie.security.security;
 
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import io.jsonwebtoken.ExpiredJwtException;
+import lombok.extern.slf4j.Slf4j;
+import me.zhengjie.base.ResponseDTO;
+import me.zhengjie.base.ResultCode;
+import me.zhengjie.security.config.bean.SecurityProperties;
+import me.zhengjie.security.service.OnlineUserService;
+import me.zhengjie.security.service.dto.OnlineUserDto;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.util.StringUtils;
+import org.springframework.web.filter.GenericFilterBean;
 
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
@@ -28,55 +39,34 @@ import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.util.StringUtils;
-import org.springframework.web.filter.GenericFilterBean;
-
-import com.alibaba.fastjson.JSONObject;
-
-import cn.hutool.core.util.StrUtil;
-import io.jsonwebtoken.ExpiredJwtException;
-import lombok.extern.slf4j.Slf4j;
-import me.zhengjie.base.config.AppConfigInfo;
-import me.zhengjie.base.ResponseDTO;
-import me.zhengjie.base.ResultCode;
-import me.zhengjie.modules.security.config.bean.SecurityProperties;
-import me.zhengjie.modules.security.service.OnlineUserService;
-import me.zhengjie.modules.security.service.UserCacheClean;
-import me.zhengjie.modules.security.service.dto.OnlineUserDto;
+import java.io.IOException;
+import java.util.*;
 
 /**
  * @author /
  */
 @Slf4j
 public class TokenFilter extends GenericFilterBean {
-	private static final Logger log = LoggerFactory.getLogger(TokenFilter.class);
-
 	private final TokenProvider tokenProvider;
 	private final SecurityProperties properties;
 	private final OnlineUserService onlineUserService;
-	private final UserCacheClean userCacheClean;
-
 	private static Set<String> anonymousUrl = new HashSet<>();
 
 	/**
 	 * @param tokenProvider     Token
 	 * @param properties        JWT
 	 * @param onlineUserService 用户在线
-	 * @param userCacheClean    用户缓存清理工具
 	 */
-	public TokenFilter(TokenProvider tokenProvider, SecurityProperties properties, OnlineUserService onlineUserService,
-			UserCacheClean userCacheClean) {
+	public TokenFilter(TokenProvider tokenProvider, SecurityProperties properties, OnlineUserService onlineUserService) {
 		this.properties = properties;
 		this.onlineUserService = onlineUserService;
 		this.tokenProvider = tokenProvider;
-		this.userCacheClean = userCacheClean;
 	}
 
+	/**
+	 * 设置匿名访问URL
+	 * @param map
+	 */
 	public final static void setAnonymousUrl(Map<String, Set<String>> map) {
 		Collection<Set<String>> sets = map.values();
 		for (Set<String> set : sets) {
@@ -88,7 +78,7 @@ public class TokenFilter extends GenericFilterBean {
 	 * 错误输出
 	 *
 	 * @param response
-	 * @param responseCodeConst
+	 * @param resultCode
 	 * @throws IOException
 	 */
 	private void outputResult(HttpServletResponse response, ResultCode resultCode) throws IOException {
@@ -113,9 +103,7 @@ public class TokenFilter extends GenericFilterBean {
 //			return;
 //		}
 		// 排除打印的日志数据,
-		if (!AppConfigInfo.APP_EXCLUDE_LOG.contains(reqUrl)) {
-			log.info("请求路径:" + reqUrl);
-		}
+		log.info("请求路径:" + reqUrl);
 
 		// 这里是处理app的接口
 		String token = resolveToken(httpServletRequest);
@@ -132,10 +120,10 @@ public class TokenFilter extends GenericFilterBean {
 				}
 			} catch (ExpiredJwtException e) {
 				log.error(e.getMessage());
-//				outputResult(httpServletResponse, ResultCode.PERMISSION_TOKEN_EXPIRED);
+				// outputResult(httpServletResponse, ResultCode.PERMISSION_TOKEN_EXPIRED);
 			} catch (Exception e) {
 				log.error(e.toString());
-//				outputResult(httpServletResponse, ResultCode.SYSTEM_INNER_ERROR);
+				// outputResult(httpServletResponse, ResultCode.SYSTEM_INNER_ERROR);
 			}
 			if (appToken != null && StringUtils.hasText(token)) {
 				// Token 续期
@@ -148,29 +136,37 @@ public class TokenFilter extends GenericFilterBean {
 		// 这里是token的问题
 		if (StrUtil.isNotBlank(token)) {
 			OnlineUserDto onlineUserDto = null;
-			boolean cleanUserCache = false;
+//			boolean cleanUserCache = false;
 			try {
-				onlineUserDto = onlineUserService.getOne(properties.getOnlineKey() + token);
+				String onlineUser = onlineUserService.getOne(properties.getOnlineKey() + token);
+				JSONObject jsonObject = JSON.parseObject(onlineUser);
+				List<SimpleGrantedAuthority> authorities = JSON.parseArray(jsonObject.getString("authorities"), SimpleGrantedAuthority.class);
+				List<GrantedAuthority> authorityList = new ArrayList<>();
+				for (SimpleGrantedAuthority simpleGrantedAuthority : authorities) {
+					authorityList.add(simpleGrantedAuthority);
+				}
+				onlineUserDto = JSON.parseObject(onlineUser, OnlineUserDto.class);
+				onlineUserDto.setAuthorities(authorityList);
 			} catch (ExpiredJwtException e) {
 				log.error(e.getMessage());
-				cleanUserCache = true;
+//				cleanUserCache = true;
 			} catch (Exception e) {
 				log.error(e.getMessage());
-				cleanUserCache = true;
+//				cleanUserCache = true;
 			}
 			// 不理解已经是空了,为什么还要删除在线人员,
-			finally {
-				try {
-					if (cleanUserCache || Objects.isNull(onlineUserDto)) {
-						userCacheClean.cleanUserCache(
-								String.valueOf(tokenProvider.getClaims(token).get(TokenProvider.AUTHORITIES_KEY)));
-					}
-				} catch (Exception e) {
-					log.error(e.getMessage());
-				}
-			}
+//			finally {
+//				try {
+//					if (cleanUserCache || Objects.isNull(onlineUserDto)) {
+//						userCacheClean.cleanUserCache(
+//								String.valueOf(tokenProvider.getClaims(token).get(TokenProvider.AUTHORITIES_KEY)));
+//					}
+//				} catch (Exception e) {
+//					log.error(e.getMessage());
+//				}
+//			}
 			if (onlineUserDto != null && StringUtils.hasText(token)) {
-				Authentication authentication = tokenProvider.getAuthentication(token);
+				Authentication authentication = new UsernamePasswordAuthenticationToken(onlineUserDto, token, new ArrayList<>());
 				SecurityContextHolder.getContext().setAuthentication(authentication);
 				// Token 续期
 				tokenProvider.checkRenewal(token);

+ 6 - 5
eladmin-system/src/main/java/me/zhengjie/modules/security/security/TokenProvider.java

@@ -13,25 +13,26 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package me.zhengjie.modules.security.security;
+package me.zhengjie.security.security;
 
 import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.util.IdUtil;
 import io.jsonwebtoken.*;
 import io.jsonwebtoken.io.Decoders;
 import io.jsonwebtoken.security.Keys;
-import lombok.extern.slf4j.Slf4j;
-import me.zhengjie.modules.security.config.bean.SecurityProperties;
+
+import me.zhengjie.security.config.bean.SecurityProperties;
 import me.zhengjie.utils.RedisUtils;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.userdetails.User;
 import org.springframework.stereotype.Component;
+
 import javax.servlet.http.HttpServletRequest;
 import java.security.Key;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.concurrent.TimeUnit;
 
 /**

+ 50 - 45
eladmin-system/src/main/java/me/zhengjie/modules/security/service/OnlineUserService.java

@@ -13,22 +13,19 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package me.zhengjie.modules.security.service;
+package me.zhengjie.security.service;
 
+import com.alibaba.fastjson.JSON;
+import com.corundumstudio.socketio.SocketIOClient;
+import com.google.gson.JsonObject;
 import lombok.extern.slf4j.Slf4j;
-import me.zhengjie.base.mq.ClientCache;
-import me.zhengjie.modules.security.config.bean.SecurityProperties;
-import me.zhengjie.modules.security.service.dto.JwtUserDto;
-import me.zhengjie.modules.security.service.dto.OnlineUserDto;
+import me.zhengjie.security.config.bean.SecurityProperties;
+import me.zhengjie.security.service.dto.OnlineUserDto;
 import me.zhengjie.utils.*;
-
 import org.springframework.data.domain.Pageable;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
-import com.corundumstudio.socketio.SocketIOClient;
-import com.google.gson.JsonObject;
-
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
@@ -52,33 +49,27 @@ public class OnlineUserService {
 
 	/**
 	 * 保存在线用户信息
-	 * 
-	 * @param jwtUserDto /
-	 * @param token      /
-	 * @param request    /
+	 * @param securityContextUser
+	 * @param token
+	 * @param request
 	 * @throws Exception
 	 */
-	public void save(JwtUserDto jwtUserDto, String token, HttpServletRequest request) throws Exception {
-		String dept = jwtUserDto.getUser().getDept().getName();
-		String ip = StringUtils.getIp(request);
-		String browser = StringUtils.getBrowser(request);
-		String address = StringUtils.getCityInfo(ip);
-		OnlineUserDto onlineUserDto = null;
-		String onlineToken = properties.getOnlineKey() + token;
-		try {
-			onlineUserDto = new OnlineUserDto(jwtUserDto.getUser().getRoles(), jwtUserDto.getUsername(), jwtUserDto.getUser().getNickName(), dept,
-					browser, ip, address, EncryptUtils.desEncrypt(token), new Date(), jwtUserDto.getUser().getOrgId(),
-					onlineToken);
-		} catch (Exception e) {
-			log.error(e.getMessage(), e);
-		}
+	public void save(Object securityContextUser, String token, HttpServletRequest request) throws Exception {
+		OnlineUserDto onlineUserDto = (OnlineUserDto) securityContextUser;
+		onlineUserDto.setKey(EncryptUtils.desEncrypt(token));
+		onlineUserDto.setOnlineToken(properties.getOnlineKey() + token);
+		onlineUserDto.setBrowser(StringUtils.getBrowser(request));
+		onlineUserDto.setIp(StringUtils.getIp(request));
+		onlineUserDto.setAddress(StringUtils.getCityInfo(StringUtils.getIp(request)));
+		onlineUserDto.setLoginTime(new Date());
+
 		// 先查询是否存在该登录用户,如果存在,则直接剔除
-		kickOutForUsername(onlineUserDto.getUserName());
+		kickOutForUsername(onlineUserDto.getUsername());
 		// TODO 这里只是单机处理,后面修改为多机处理
 		Map<String, HashMap<UUID, SocketIOClient>> socketServers = ClientCache.getWebSocketMap();
 //		List<String> names = new ArrayList<String>();
 		for (String webSocketName : socketServers.keySet()) {
-			if (StringUtils.isNotBlank(webSocketName) && onlineUserDto.getUserName().equals(webSocketName)) {
+			if (StringUtils.isNotBlank(webSocketName) && onlineUserDto.getUsername().equals(webSocketName)) {
 				HashMap<UUID, SocketIOClient> userClient = socketServers.get(webSocketName);
 				userClient.forEach((uuid, socketIOClient) -> {
 					JsonObject obj = new JsonObject();
@@ -91,7 +82,7 @@ public class OnlineUserService {
 //		for (String key : names) {
 //			socketServers.remove(key);
 //		}
-		redisUtils.set(properties.getOnlineKey() + token, onlineUserDto, properties.getTokenValidityInSeconds() / 1000);
+		redisUtils.set(properties.getOnlineKey() + token, JSON.toJSONString(securityContextUser), properties.getTokenValidityInSeconds() / 1000);
 	}
 
 	/**
@@ -116,20 +107,36 @@ public class OnlineUserService {
 	public List<OnlineUserDto> getAll(String filter) {
 		List<String> keys = redisUtils.scan(properties.getOnlineKey() + "*");
 		Collections.reverse(keys);
-		List<OnlineUserDto> onlineUserDtos = new ArrayList<>();
+		List<OnlineUserDto> onlineUserList = new ArrayList<>();
 		for (String key : keys) {
-			OnlineUserDto onlineUserDto = (OnlineUserDto) redisUtils.get(key);
+			OnlineUserDto onlineUserDto = JSON.parseObject((String) redisUtils.get(key), OnlineUserDto.class);
 			// onlineUserDto.setToken(key);
 			if (StringUtils.isNotBlank(filter)) {
 				if (onlineUserDto.toString().contains(filter)) {
-					onlineUserDtos.add(onlineUserDto);
+					onlineUserList.add(onlineUserDto);
 				}
 			} else {
-				onlineUserDtos.add(onlineUserDto);
+				onlineUserList.add(onlineUserDto);
 			}
 		}
-		onlineUserDtos.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime()));
-		return onlineUserDtos;
+		onlineUserList.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime()));
+		return onlineUserList;
+	}
+
+	/**
+	 * 查询全部登录用户
+	 *
+	 * @return
+	 */
+	public List<Object> getAllLoginUser() {
+		List<String> keys = redisUtils.scan(properties.getOnlineKey() + "*");
+		Collections.reverse(keys);
+		List<Object> securityContextUsers = new ArrayList<>();
+		for (String key : keys) {
+			securityContextUsers.add(redisUtils.get(key));
+
+		}
+		return securityContextUsers;
 	}
 
 	/**
@@ -144,7 +151,7 @@ public class OnlineUserService {
 
 	/**
 	 * 退出登录
-	 * 
+	 *
 	 * @param token /
 	 */
 	public void logout(String token) {
@@ -163,7 +170,7 @@ public class OnlineUserService {
 		List<Map<String, Object>> list = new ArrayList<>();
 		for (OnlineUserDto user : all) {
 			Map<String, Object> map = new LinkedHashMap<>();
-			map.put("用户名", user.getUserName());
+			map.put("用户名", user.getUsername());
 			map.put("部门", user.getDept());
 			map.put("登录IP", user.getIp());
 			map.put("登录地点", user.getAddress());
@@ -180,8 +187,8 @@ public class OnlineUserService {
 	 * @param key /
 	 * @return /
 	 */
-	public OnlineUserDto getOne(String key) {
-		return (OnlineUserDto) redisUtils.get(key);
+	public String getOne(String key) {
+		return (String) redisUtils.get(key);
 	}
 
 	/**
@@ -195,12 +202,10 @@ public class OnlineUserService {
 			return;
 		}
 		for (OnlineUserDto onlineUserDto : onlineUserDtos) {
-			if (onlineUserDto.getUserName().equals(userName)) {
+			if (onlineUserDto.getUsername().equals(userName)) {
 				try {
 					String token = EncryptUtils.desDecrypt(onlineUserDto.getKey());
-					if (StringUtils.isNotBlank(igoreToken) && !igoreToken.equals(token)) {
-						this.kickOut(token);
-					} else if (StringUtils.isBlank(igoreToken)) {
+					if (StringUtils.isBlank(igoreToken) || !igoreToken.equals(token)) {
 						this.kickOut(token);
 					}
 				} catch (Exception e) {
@@ -219,7 +224,7 @@ public class OnlineUserService {
 	public void kickOutForUsername(String username) throws Exception {
 		List<OnlineUserDto> onlineUsers = getAll(username);
 		for (OnlineUserDto onlineUser : onlineUsers) {
-			if (onlineUser.getUserName().equals(username)) {
+			if (onlineUser.getUsername().equals(username)) {
 				String token = EncryptUtils.desDecrypt(onlineUser.getKey());
 				kickOut(token);
 			}

+ 72 - 0
eladmin-security/src/main/java/me/zhengjie/security/service/dto/OnlineUserDto.java

@@ -0,0 +1,72 @@
+package me.zhengjie.security.service.dto;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+@Getter
+@Setter
+@NoArgsConstructor
+public class OnlineUserDto implements UserDetails {
+    private Long userId;
+    private String username;
+    private String password;
+    private String nickName;
+    private String dept;
+    private String key;
+    private String onlineToken;
+    private String ip;
+    private String address;
+    private String browser;
+    private Date loginTime;
+    private boolean enabled;
+    private List<Long> dataScopes;
+    private List<GrantedAuthority> authorities;
+
+    @Override
+    public List<GrantedAuthority> getAuthorities() {
+        return authorities;
+    }
+
+    @Override
+    @JSONField(serialize = false)
+    public String getPassword() {
+        return password;
+    }
+
+    @Override
+    public String getUsername() {
+        return username;
+    }
+
+    @JSONField(serialize = false)
+    @Override
+    public boolean isAccountNonExpired() {
+        return true;
+    }
+
+    @JSONField(serialize = false)
+    @Override
+    public boolean isAccountNonLocked() {
+        return true;
+    }
+
+    @JSONField(serialize = false)
+    @Override
+    public boolean isCredentialsNonExpired() {
+        return true;
+    }
+
+    @Override
+    @JSONField(serialize = false)
+    public boolean isEnabled() {
+        return enabled;
+    }
+}