From 9f62720587d7efc656f33c4301c6b5d897e60703 Mon Sep 17 00:00:00 2001 From: lyfO_o <764716047@qq.com> Date: 星期一, 04 七月 2022 18:01:09 +0800 Subject: [PATCH] 调整 --- safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/exception/GlobalExceptionHandler.java | 2 safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/redis/RedisUtils.java | 250 +++++++++++++++++++++++++++++++++++ safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/security/TokenAuthenticationFilter.java | 50 +++++- safePlatfrom-out-web/pom.xml | 2 safePlatfrom-out-web/src/main/resources/config/application-dev.yaml | 13 + safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/redis/RedisConfig.java | 43 ++++++ safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/Application.java | 2 pom.xml | 7 + 8 files changed, 358 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 79aa802..4327bd3 100644 --- a/pom.xml +++ b/pom.xml @@ -146,6 +146,13 @@ <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatisPlusStarter.version}</version> </dependency> + + + <!-- redis连接 --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-redis</artifactId> + </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> diff --git a/safePlatfrom-out-web/pom.xml b/safePlatfrom-out-web/pom.xml index 2d7cea8..9ee4ea0 100644 --- a/safePlatfrom-out-web/pom.xml +++ b/safePlatfrom-out-web/pom.xml @@ -64,4 +64,4 @@ </build> -</project> \ No newline at end of file +</project> diff --git a/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/Application.java b/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/Application.java index 04148da..9abeb8c 100644 --- a/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/Application.java +++ b/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/Application.java @@ -3,6 +3,8 @@ import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.stereotype.Component; @SpringBootApplication @EnableDubbo diff --git a/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/exception/GlobalExceptionHandler.java b/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/exception/GlobalExceptionHandler.java index 7e23d1d..d145f4d 100644 --- a/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/exception/GlobalExceptionHandler.java +++ b/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/exception/GlobalExceptionHandler.java @@ -38,7 +38,7 @@ @ExceptionHandler(value = BusinessException.class) public ResultVO AHandler(BusinessException e) { logger.warn(e.getMessage()); - return new ResultVO(e.getError()); + return new ResultVO(e.getCode(),e.getMessage()); } diff --git a/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/redis/RedisConfig.java b/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/redis/RedisConfig.java new file mode 100644 index 0000000..783b5f2 --- /dev/null +++ b/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/redis/RedisConfig.java @@ -0,0 +1,43 @@ +package com.gkhy.safePlatform.config.redis; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +public class RedisConfig { + + + + /** + * @Description: key和value的序列化方式 + */ + @Bean + public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { + + RedisTemplate<String, Object> template = new RedisTemplate<>(); + template.setConnectionFactory(factory); + // json序列化对象 + GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + // key=>string + template.setKeySerializer(stringRedisSerializer); + // hash=>string + template.setHashKeySerializer(stringRedisSerializer); + // value=>json + template.setValueSerializer(jackson2JsonRedisSerializer); + // hashValue=>json + template.setHashValueSerializer(jackson2JsonRedisSerializer); + // set + template.afterPropertiesSet(); + return template; + } + + + + + +} diff --git a/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/redis/RedisUtils.java b/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/redis/RedisUtils.java new file mode 100644 index 0000000..08fe8f7 --- /dev/null +++ b/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/redis/RedisUtils.java @@ -0,0 +1,250 @@ +package com.gkhy.safePlatform.config.redis; + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.redis.connection.RedisClusterConnection; +import org.springframework.data.redis.connection.RedisClusterNode; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.JedisClusterConnection; +import org.springframework.data.redis.connection.jedis.JedisConnection; +import org.springframework.data.redis.core.*; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** +* @Description: redis工具类 +*/ + +@Repository("configRedisRepository") +@SuppressWarnings(value = { "unchecked", "rawtypes" }) +public class RedisUtils { + + + @Resource + private RedisTemplate redisTemplate; + /** + * logger + */ + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + /** + * 写入缓存 + * @param key + * @param value + * @return + */ + public boolean set(final String key, Object value) { + boolean result = false; + try { + ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); + operations.set(key, value); + result = true; + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + /** + * 写入缓存设置时效时间 + * @param key + * @param value + * @return + */ + public boolean set(final String key, Object value, Long expireTime ,TimeUnit timeUnit) { + boolean result = false; + try { + ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); + operations.set(key, value); + redisTemplate.expire(key, expireTime, timeUnit); + result = true; + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + /** + * 批量删除对应的value + * @param keys + */ + public void remove(final String... keys) { + for (String key : keys) { + remove(key); + } + } + /** + * 批量删除key + * @param pattern + */ + public void removePattern(final String pattern) { + Set<Serializable> keys = redisTemplate.keys(pattern); + if (keys.size() > 0){ + redisTemplate.delete(keys); + } + } + /** + * 删除对应的value + * @param key + */ + public void remove(final String key) { + if (exists(key)) { + redisTemplate.delete(key); + } + } + /** + * 判断缓存中是否有对应的value + * @param key + * @return + */ + public boolean exists(final String key) { + return redisTemplate.hasKey(key); + } + /** + * 读取缓存 + * @param key + * @return + */ + public Object get(final String key) { + Object result = null; + ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); + result = operations.get(key); + return result; + } + /** + * 哈希 添加 + * @param key + * @param hashKey + * @param value + */ + public void hmSet(String key, Object hashKey, Object value){ + HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); + hash.put(key,hashKey,value); + } + /** + * 哈希获取数据 + * @param key + * @param hashKey + * @return + */ + public Object hmGet(String key, Object hashKey){ + HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); + return hash.get(key,hashKey); + } + /** + * 列表添加 + * @param k + * @param v + */ + public void lPush(String k,Object v){ + ListOperations<String, Object> list = redisTemplate.opsForList(); + list.rightPush(k,v); + } + /** + * 列表获取 + * @param k + * @param l + * @param l1 + * @return + */ + public List<Object> lRange(String k, long l, long l1){ + ListOperations<String, Object> list = redisTemplate.opsForList(); + return list.range(k,l,l1); + } + /** + * 集合添加 + * @param key + * @param value + */ + public void add(String key,Object value){ + SetOperations<String, Object> set = redisTemplate.opsForSet(); + set.add(key,value); + } + /** + * 集合获取 + * @param key + * @return + */ + public Set<Object> setMembers(String key){ + SetOperations<String, Object> set = redisTemplate.opsForSet(); + return set.members(key); + } + /** + * 有序集合添加 + * @param key + * @param value + * @param scoure + */ + public void zAdd(String key,Object value,double scoure){ + ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); + zset.add(key,value,scoure); + } + /** + * 有序集合获取 + * @param key + * @param scoure + * @param scoure1 + * @return + */ + public Set<Object> rangeByScore(String key,double scoure,double scoure1){ + ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); + return zset.rangeByScore(key, scoure, scoure1); + } + + /** + * @Description: 获取过期时间 返回 秒 + */ + + public Long getExpireTime(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + + /** + * @Description: 重置key 的 过期时间 + */ + public void resetKeyExpireTime(String key, Long seconds) { + redisTemplate.expire(key, seconds, TimeUnit.SECONDS); + } + + public Set<String> scanMatch(String matchKey) { + Set<String> keys = new HashSet(); + RedisConnectionFactory connectionFactory = redisTemplate.getConnectionFactory(); + RedisConnection redisConnection = connectionFactory.getConnection(); + Cursor<byte[]> scan = null; + if(redisConnection instanceof JedisClusterConnection){ + RedisClusterConnection clusterConnection = connectionFactory.getClusterConnection(); + Iterable<RedisClusterNode> redisClusterNodes = clusterConnection.clusterGetNodes(); + Iterator<RedisClusterNode> iterator = redisClusterNodes.iterator(); + while (iterator.hasNext()) { + RedisClusterNode next = iterator.next(); + scan = clusterConnection.scan(next, ScanOptions.scanOptions().match(matchKey).count(Integer.MAX_VALUE).build()); + while (scan.hasNext()) { + keys.add(new String(scan.next())); + } + scan.close(); + } + return keys; + } + if(redisConnection instanceof JedisConnection){ + scan = redisConnection.scan(ScanOptions.scanOptions().match(matchKey).count(Integer.MAX_VALUE).build()); + while (scan.hasNext()){ + //找到一次就添加一次 + keys.add(new String(scan.next())); + } + scan.close(); + return keys; + } + + return keys; +} + +} diff --git a/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/security/TokenAuthenticationFilter.java b/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/security/TokenAuthenticationFilter.java index ae3b0f6..46b5c97 100644 --- a/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/security/TokenAuthenticationFilter.java +++ b/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/security/TokenAuthenticationFilter.java @@ -9,6 +9,8 @@ import com.gkhy.safePlatform.commons.enums.RedisKeyEnum; import com.gkhy.safePlatform.commons.enums.ResultCodes; import com.gkhy.safePlatform.commons.exception.BusinessException; +import com.gkhy.safePlatform.commons.utils.RPCUtils; +import com.gkhy.safePlatform.commons.utils.RedisUtils; import com.gkhy.safePlatform.commons.utils.StringUtils; import com.gkhy.safePlatform.commons.vo.ResultVO; import org.apache.dubbo.config.annotation.DubboReference; @@ -39,6 +41,8 @@ private TokenConfig tokenConfig; @DubboReference(check = false) private AccountAuthService userAccountService; + @Autowired + private RedisUtils redisUtils; @@ -55,7 +59,7 @@ chain.doFilter(req, resp); } catch (BusinessException e) { // 返回异常 - this.writeJSON(req, resp, new ResultVO<>(e.getError())); + this.writeJSON(req, resp, new ResultVO<>(e.getCode(),e.getMessage())); } } @@ -75,14 +79,14 @@ // 这里是验证获取权限信息 // 1.从redis中获取对应该用户的权限信息 String accessTokenKey = RedisKeyEnum.authKey(RedisKeyEnum.AUTH_TOKEN, loginUserId); - String o = userAccountService.getValueByKeyFromRedis(accessTokenKey); + Object o = redisUtils.get(accessTokenKey); // 2.token是否存在 if (o == null) { // 是否存在 - throw new BusinessException(ResultCodes.CLIENT_CREDENTIALS_SIGN_INVALID); + throw new BusinessException(ResultCodes.CLIENT_CREDENTIALS_TOKEN_INVALID); }else{ Long userId = Long.valueOf(loginUserId); - CacheUser cacheUser = JSONObject.parseObject(o, CacheUser.class); + CacheUser cacheUser = JSONObject.parseObject(o.toString(), CacheUser.class); assert userId.equals(cacheUser.getUserId()); if ( !authToken.equals(cacheUser.getAccessToken())) { throw new BusinessException(ResultCodes.CLIENT_CREDENTIALS_TOKEN_INVALID); @@ -90,23 +94,51 @@ // 3.redis获取权限 String authoritiesKey = RedisKeyEnum.authKey(RedisKeyEnum.AUTH_AUTHORITIES, userId); - String oo = userAccountService.getValueByKeyFromRedis(authoritiesKey); + Object oo = redisUtils.get(authoritiesKey); List<GrantedAuthority> authorities = new ArrayList<>(); // 4.redis中是否存在 if (oo != null) { // 5.存在 - List<CacheAuthority> cacheAuthorities = JSONArray.parseArray(oo, CacheAuthority.class); + List<CacheAuthority> cacheAuthorities = JSONArray.parseArray(oo.toString(), CacheAuthority.class); for (CacheAuthority cacheAuthority: cacheAuthorities) { authorities.add(new SimpleGrantedAuthority(cacheAuthority.getAuthority())); } }else { // 6.不存在=>数据库查询 - String roleCode = userAccountService.getUserRoleCodeByUserId(userId); + ResultVO<String> rpcResultRole = userAccountService.getUserRoleCodeByUserId(userId); + + if (rpcResultRole == null) { + throw new BusinessException(ResultCodes.RPC_RESULT_NULL); + } + if (!ResultCodes.OK.getCode().equals(rpcResultRole.getCode())) { + throw new BusinessException(rpcResultRole.getCode(), rpcResultRole.getMsg()); + } + if (rpcResultRole.getData() == null) { + throw new BusinessException(ResultCodes.RPC_DATA_NULL); + } + if (!(rpcResultRole.getData() instanceof String)) { + throw new BusinessException(ResultCodes.RPC_DATA_TYPE_NOT_MATCH); + } // role - authorities.add(new SimpleGrantedAuthority("ROLE_" + roleCode)); + authorities.add(new SimpleGrantedAuthority("ROLE_" + rpcResultRole.getData().toString())); // permission - List<String> permissions = userAccountService.getUserPermissionByUserId(userId); + ResultVO<List<String>> rpcResultPermission = userAccountService.getUserPermissionByUserId(userId); + + if (rpcResultPermission == null) { + throw new BusinessException(ResultCodes.RPC_RESULT_NULL); + } + if (!ResultCodes.OK.getCode().equals(rpcResultPermission.getCode())) { + throw new BusinessException(rpcResultRole.getCode(), rpcResultRole.getMsg()); + } + if (rpcResultPermission.getData() == null) { + throw new BusinessException(ResultCodes.RPC_DATA_NULL); + } + if (!(rpcResultPermission.getData() instanceof List)) { + throw new BusinessException(ResultCodes.RPC_DATA_TYPE_NOT_MATCH); + } + + List<String> permissions = RPCUtils.castList(rpcResultPermission.getData(), String.class); for (String permission : permissions) { SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(permission); authorities.add(simpleGrantedAuthority); diff --git a/safePlatfrom-out-web/src/main/resources/config/application-dev.yaml b/safePlatfrom-out-web/src/main/resources/config/application-dev.yaml index 8449e89..8bb6864 100644 --- a/safePlatfrom-out-web/src/main/resources/config/application-dev.yaml +++ b/safePlatfrom-out-web/src/main/resources/config/application-dev.yaml @@ -21,6 +21,19 @@ username: gkhy_dev_out_team password: Adsdf675T6AC7yga type: com.alibaba.druid.pool.DruidDataSource + redis: + host: 127.0.0.1 + port: 6379 + password: root # Redis 服务器密码,默认为空。生产中,一定要设置 Redis 密码! + database: 0 # Redis 数据库号,默认为 0 + timeout: 15000 # Redis 连接超时时间,单位:毫秒。 + # 对应 RedisProperties.Jedis 内部类 + jedis: + pool: + max-active: 8 # 连接池最大连接数,默认为 8 。使用负数表示没有限制 同一时间最大只能执行8条sql语句,每执行一条语句就会建立一个连接 + max-idle: 8 # 默认连接数最大空闲的连接数,默认为 8 。使用负数表示没有限制。 + min-idle: 0 # 默认连接池最小空闲的连接数,默认为 0 。允许设置 0 和 正数。 + max-wait: -1 mybatis-plus: -- Gitblit v1.9.2