@@ -46,6 +46,7 @@ task commCore(type:Jar){ | |||
archiveExtension='jar' | |||
from("build/classes/java/main/cn/com/taiji/core"){ | |||
include "**/manager/comm/**" | |||
include "**/manager/cache/**" | |||
include "**/manager/tools/**" | |||
include "**/model/comm/*" | |||
include "**/model/comm/protocol/*" |
@@ -0,0 +1,14 @@ | |||
package cn.com.taiji.core.manager.cache; | |||
import cn.com.taiji.common.model.finals.SysFinals; | |||
public class LoginCacheFinals extends SysFinals { | |||
public final static int LOGIN_TRY_COUNT = 5;// 次 | |||
public final static int LOGIN_FAILED_EXPIRE = 5;// 分钟 | |||
public final static int LOGIN_CODE_EXPIRED = 5 * 60;// 分钟 | |||
public final static int LOGIN_TOKEN_EXPIRED = 24 * 60;// 分钟 | |||
public final static int LOGIN_SMS_CODE_EXPIRED = 1;// 分钟 | |||
} |
@@ -0,0 +1,72 @@ | |||
package cn.com.taiji.core.manager.cache; | |||
import cn.com.taiji.common.manager.AbstractManager; | |||
import cn.com.taiji.common.manager.net.http.ServiceHandleException; | |||
import cn.com.taiji.common.pub.json.JsonTools; | |||
import cn.com.taiji.core.entity.dict.basic.SourceType; | |||
import cn.com.taiji.core.entity.user.AccountInfo; | |||
import cn.com.taiji.core.model.comm.protocol.valid.GlyServiceError; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Component; | |||
import java.io.IOException; | |||
import java.util.concurrent.TimeUnit; | |||
@Component | |||
public class RedisCacheManager extends AbstractManager { | |||
@Autowired(required = false) | |||
protected RedisManager redisManager; | |||
protected void setTokenCache(AccountInfo accountInfo, String accessToken, String agencyId) { | |||
redisManager.set(RedisKeyGenerator.getLoginOpenIdKey(accessToken), accountInfo.getOpenId(), LoginCacheFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.set(RedisKeyGenerator.getLoginSourceTypeKey(accessToken), accountInfo.getLoginSource().name(), LoginCacheFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.set(RedisKeyGenerator.getLoginAccountInfoKey(accessToken), accountInfo.toJson(), LoginCacheFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.set(RedisKeyGenerator.getLoginAgencyIdKey(accessToken), agencyId, LoginCacheFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.set(RedisKeyGenerator.getLoginTokenKey(accountInfo.getOpenId()), accessToken, LoginCacheFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
} | |||
protected void checkTokenCache(String accessToken, String openId, SourceType loginSource) throws ServiceHandleException { | |||
String openIdCache = redisManager.get(RedisKeyGenerator.getLoginOpenIdKey(accessToken)); | |||
if (!hasText(openIdCache)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
if (!openId.equals(openIdCache)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
String loginSourceStr = redisManager.get(RedisKeyGenerator.getLoginSourceTypeKey(accessToken)); | |||
if (!hasText(loginSourceStr)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
if (!loginSourceStr.equals(loginSource.name())) | |||
throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
String accountInfoStr = redisManager.get(RedisKeyGenerator.getLoginAccountInfoKey(accessToken)); | |||
if (!hasText(accountInfoStr)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
AccountInfo accountInfo = null; | |||
try { | |||
accountInfo = JsonTools.json2Object(accountInfoStr, AccountInfo.class); | |||
} catch (IOException e) { | |||
throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效,信息解析失败"); | |||
} | |||
String accessTokenCache = redisManager.get(RedisKeyGenerator.getLoginTokenKey(openId)); | |||
if (!hasText(accessTokenCache)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
if (!accessToken.equals(accessTokenCache)) | |||
throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
} | |||
protected void expireTokenCache(String accessToken, String openId) { | |||
redisManager.expire(RedisKeyGenerator.getLoginOpenIdKey(accessToken), LoginCacheFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.expire(RedisKeyGenerator.getLoginSourceTypeKey(accessToken), LoginCacheFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.expire(RedisKeyGenerator.getLoginAccountInfoKey(accessToken), LoginCacheFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.expire(RedisKeyGenerator.getLoginAgencyIdKey(accessToken), LoginCacheFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.expire(RedisKeyGenerator.getLoginTokenKey(openId), LoginCacheFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
} | |||
protected void deleteTokenCache(String accessToken, String openId) { | |||
redisManager.delete(RedisKeyGenerator.getLoginOpenIdKey(accessToken)); | |||
redisManager.delete(RedisKeyGenerator.getLoginSourceTypeKey(accessToken)); | |||
redisManager.delete(RedisKeyGenerator.getLoginAccountInfoKey(accessToken)); | |||
redisManager.delete(RedisKeyGenerator.getLoginAgencyIdKey(accessToken)); | |||
redisManager.delete(RedisKeyGenerator.getLoginTokenKey(openId)); | |||
} | |||
protected String findOpenIdByToken(String accessToken) throws ServiceHandleException { | |||
String openId = redisManager.get(RedisKeyGenerator.getLoginOpenIdKey(accessToken)); | |||
if (!hasText(openId)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
return openId; | |||
} | |||
} |
@@ -0,0 +1,46 @@ | |||
package cn.com.taiji.core.manager.cache; | |||
import cn.com.taiji.common.manager.AbstractManager; | |||
import cn.com.taiji.core.entity.dict.basic.SourceType; | |||
public class RedisKeyGenerator extends AbstractManager { | |||
private final static String COLON = ":"; | |||
private final static String FAIL_COUNT_KEY_PREFIX = "issues:failedcount:"; | |||
private final static String LOGIN_KEY_PREFIX = "issues:login:"; | |||
public static String getFailCountKey(String accountName, SourceType sourceType) { | |||
return FAIL_COUNT_KEY_PREFIX + accountName + COLON + sourceType; | |||
} | |||
public static String getLoginOpenIdByCodeKey(String code, String loginSource) { | |||
return LOGIN_KEY_PREFIX + COLON + "getopenIdByCode" + COLON + code + COLON + loginSource; | |||
} | |||
public static String getLoginOpenIdKey(String accessToken) { | |||
return LOGIN_KEY_PREFIX + COLON + "getopenId" + COLON + accessToken; | |||
} | |||
public static String getLoginSourceTypeKey(String accessToken) { | |||
return LOGIN_KEY_PREFIX + COLON + "getsourcetype" + COLON + accessToken; | |||
} | |||
public static String getLoginAccountInfoKey(String accessToken) { | |||
return LOGIN_KEY_PREFIX + COLON + "getaccountinfo" + COLON + accessToken; | |||
} | |||
public static String getLoginAgencyIdKey(String accessToken) { | |||
return LOGIN_KEY_PREFIX + COLON + "getagencyid" + COLON + accessToken; | |||
} | |||
public static String getLoginTokenKey(String openId) { | |||
return LOGIN_KEY_PREFIX + COLON + "gettoken" + COLON + openId; | |||
} | |||
public static String getSmsCodeKey(String mobile, String loginSource, Integer businessType) { | |||
return LOGIN_KEY_PREFIX + COLON + "getsmscode" + COLON + mobile + COLON + loginSource + COLON + businessType; | |||
} | |||
} |
@@ -0,0 +1,13 @@ | |||
package cn.com.taiji.core.manager.cache; | |||
import java.util.concurrent.TimeUnit; | |||
public interface RedisManager { | |||
void set(String key, String value, long timeout, TimeUnit timeUnit); | |||
String get(String key); | |||
Boolean expire(String key, long timeout, TimeUnit timeUnit); | |||
Boolean delete(String key); | |||
} |
@@ -16,15 +16,10 @@ public class AccessTokenCheckRequest extends AbstractPortalRequest<AccessTokenCh | |||
public AccessTokenCheckRequest() { | |||
super(PortalServiceCmd.ACCESSTOKENCHECK); | |||
} | |||
@NotBlank(message = "openId不能为空") | |||
private String openId; | |||
@NotNull(message = "来源不能为空") | |||
private SourceType loginSource; | |||
@NotBlank(message = "Token不能为空") | |||
private String accessToken; | |||
// private AccessTokenType tokenType; //token类型 | |||
@Override | |||
protected void validate(ErrorMsgBuilder builder) { |
@@ -18,8 +18,6 @@ public class LogoutRequest extends AbstractPortalRequest<LogoutResponse> { | |||
super(PortalServiceCmd.LOGOUT); | |||
} | |||
@NotBlank(message = "openId不能为空") | |||
private String openId; | |||
@NotNull(message = "来源不能为空") | |||
private SourceType loginSource; | |||
@NotBlank(message = "Token不能为空") |
@@ -50,4 +50,12 @@ public interface AccountUserRoleRepo extends AbstractJpaRepo<AccountUserRole, St | |||
@Query(" from AccountUserRole where roleId in ?1") | |||
List<AccountUserRole> findByRoleIdList(List<String> roleIdList); | |||
/** | |||
* 根据用户openId查找该用户的系统访问权限 | |||
* @param openId | |||
* @return | |||
*/ | |||
@Query(nativeQuery = true, value = " select b.system_type from user_account_role a, user_role b where a.role_id = b.id and b.status = 'ENABLE' and a.open_id = ?1") | |||
List<SystemType> findSystemTypeByOpenId(String openId); | |||
} |
@@ -15,6 +15,8 @@ dependencies { | |||
implementation "com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config" | |||
implementation "org.springframework.cloud:spring-cloud-starter-openfeign" | |||
implementation 'com.alibaba:easyexcel:3.2.1' | |||
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis' | |||
implementation(group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0') { | |||
// exclude group: 'net.bytebuddy',module: 'byte-buddy' | |||
} |
@@ -1,15 +1,12 @@ | |||
package cn.com.taiji.userw.api.rbac; | |||
import cn.com.taiji.common.manager.ManagerException; | |||
import cn.com.taiji.common.manager.net.http.ServiceHandleException; | |||
import cn.com.taiji.common.web.ApiResponse; | |||
import cn.com.taiji.userw.api.MyValidController; | |||
import cn.com.taiji.userw.dto.rbac.RbacMenuListBySystemTypeRequestDTO; | |||
import cn.com.taiji.userw.dto.rbac.RbacMenuListBySystemTypeResponseDTO; | |||
import cn.com.taiji.userw.dto.rbac.SystemTypeListByRbacSourceRequestDTO; | |||
import cn.com.taiji.userw.dto.rbac.SystemTypeListByRbacSourceResponseDTO; | |||
import cn.com.taiji.userw.dto.rbac.*; | |||
import cn.com.taiji.userw.manager.rbac.RbacMenuManger; | |||
import cn.com.taiji.userw.manager.rbac.RbacRoleManger; | |||
import cn.com.taiji.userw.model.rbac.SystemTypeMode; | |||
import cn.com.taiji.userw.manager.rbac.RbacSystemTypeManager; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiOperation; | |||
import org.springframework.web.bind.annotation.PostMapping; | |||
@@ -18,7 +15,6 @@ import org.springframework.web.bind.annotation.RequestMapping; | |||
import org.springframework.web.bind.annotation.RestController; | |||
import javax.annotation.Resource; | |||
import java.util.List; | |||
/** | |||
* @Author ChenChao | |||
@@ -32,6 +28,8 @@ public class RabcSystemTypeController extends MyValidController { | |||
@Resource | |||
private RbacMenuManger rbacMenuManger; | |||
@Resource | |||
private RbacSystemTypeManager rbacSystemTypeManager; | |||
@ApiOperation(value = "根据系统类型获取菜单列表") | |||
@PostMapping(value = "/menulistbysystemtype") | |||
@@ -46,6 +44,10 @@ public class RabcSystemTypeController extends MyValidController { | |||
} | |||
@ApiOperation(value = "根据系统类别获取所属系统列表") | |||
@PostMapping(value = "/systemTypeByAccountRole") | |||
public ApiResponse<RbacSystemTypeByOpenIdResponseDTO> systemTypeByAccountRole(@RequestBody RbacSystemTypeByOpenIdRequestDTO dto) throws ServiceHandleException { | |||
return ApiResponse.of(rbacSystemTypeManager.systemTypeByOpneId(dto)).setMessage("获取小程序系统下的所有角色成功"); | |||
} | |||
} |
@@ -18,11 +18,16 @@ import lombok.experimental.Accessors; | |||
@Accessors(chain = true) | |||
@Validated | |||
public abstract class AbstractBizRequestDTO extends BaseValidDTO { | |||
@NotBlank(message = "accessToken不能为空") | |||
private String accessToken; | |||
@NotBlank(message = "loginSource不能为空") | |||
private String loginSource; | |||
// 前端公参 | |||
@NotBlank(message = "openId不能为空") | |||
private String openId; | |||
@NotBlank(message = "loginSource不能为空") | |||
private String loginSource; | |||
@NotBlank(message = "agentId不能为空") | |||
@FixedLength(length = 11) | |||
private String agentId; |
@@ -0,0 +1,14 @@ | |||
package cn.com.taiji.userw.dto.rbac; | |||
import cn.com.taiji.userw.dto.AbstractBizRequestDTO; | |||
import lombok.Getter; | |||
import lombok.Setter; | |||
import lombok.experimental.Accessors; | |||
@Getter | |||
@Setter | |||
@Accessors(chain = true) | |||
public class RbacSystemTypeByOpenIdRequestDTO extends AbstractBizRequestDTO { | |||
} |
@@ -0,0 +1,15 @@ | |||
package cn.com.taiji.userw.dto.rbac; | |||
import cn.com.taiji.common.model.BaseModel; | |||
import lombok.Getter; | |||
import lombok.Setter; | |||
import lombok.experimental.Accessors; | |||
import java.util.List; | |||
@Getter | |||
@Setter | |||
@Accessors(chain = true) | |||
public class RbacSystemTypeByOpenIdResponseDTO extends BaseModel { | |||
private List<RbacSystemTypeByOpenIdVO> list; | |||
} |
@@ -0,0 +1,16 @@ | |||
package cn.com.taiji.userw.dto.rbac; | |||
import cn.com.taiji.common.model.BaseModel; | |||
import lombok.Getter; | |||
import lombok.Setter; | |||
import lombok.experimental.Accessors; | |||
@Getter | |||
@Setter | |||
@Accessors(chain = true) | |||
public class RbacSystemTypeByOpenIdVO extends BaseModel { | |||
private String name; | |||
private Integer code; | |||
} |
@@ -0,0 +1,212 @@ | |||
package cn.com.taiji.userw.manager; | |||
import cn.com.taiji.common.entity.BaseEntity; | |||
import cn.com.taiji.common.manager.AbstractManager; | |||
import cn.com.taiji.common.model.dao.Pagination; | |||
import cn.com.taiji.common.pub.StringTools; | |||
import cn.com.taiji.common.pub.json.JsonTools; | |||
import cn.com.taiji.core.manager.cache.RedisManager; | |||
import org.apache.commons.collections4.map.HashedMap; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.data.redis.core.Cursor; | |||
import org.springframework.data.redis.core.HashOperations; | |||
import org.springframework.data.redis.core.RedisTemplate; | |||
import org.springframework.data.redis.core.ScanOptions.ScanOptionsBuilder; | |||
import org.springframework.stereotype.Service; | |||
import java.io.IOException; | |||
import java.util.*; | |||
import java.util.Map.Entry; | |||
import java.util.concurrent.TimeUnit; | |||
import java.util.function.Supplier; | |||
/** | |||
* hash操作的方法以hash开头,如:hashGet<br> | |||
* | |||
* @author lijun <br> | |||
* Create Time:2018年12月9日 下午1:43:54<br> | |||
* mail:756915505@qq.com | |||
* @since 1.0 | |||
* @version 1.0 | |||
*/ | |||
@Service | |||
public class RedisWrapManager extends AbstractManager implements RedisManager { | |||
@Autowired(required = false) | |||
private RedisTemplate<String, String> redisTemplate; | |||
public Set<String> key(String pattern) { | |||
if ("*".equals(pattern)) { | |||
throw new RuntimeException("禁止全扫描key"); | |||
} | |||
return redisTemplate.keys(pattern); | |||
} | |||
public Boolean expire(String key, final long timeout, final TimeUnit unit) { | |||
return redisTemplate.expire(key, timeout, unit); | |||
} | |||
public String get(String key) { | |||
return redisTemplate.opsForValue().get(key); | |||
} | |||
public String getAndSet(String key, String value) { | |||
return redisTemplate.opsForValue().getAndSet(key, value); | |||
} | |||
public void set(String key, String value, long timeout, TimeUnit unit) { | |||
redisTemplate.opsForValue().set(key, value, timeout, unit); | |||
} | |||
public boolean setIfAbsent(String key, String value, long timeout, TimeUnit unit) { | |||
return redisTemplate.opsForValue().setIfAbsent(key, value, timeout, unit); | |||
} | |||
public long increment(String key, long delta) { | |||
return redisTemplate.opsForValue().increment(key, delta); | |||
} | |||
public Boolean delete(String key) { | |||
return redisTemplate.delete(key); | |||
} | |||
public long listRightPush(String key, String value) { | |||
return redisTemplate.opsForList().rightPush(key, value); | |||
} | |||
/** | |||
* 返回存储在 key 的列表里指定范围内的元素。 start 和 end 偏移量都是基于0的下标,即list的第一个元素下标是0(list的表头),第二个元素下标是1,以此类推。 | |||
* 偏移量也可以是负数,表示偏移量是从list尾部开始计数。 例如, -1 表示列表的最后一个元素,-2 是倒数第二个,以此类推 | |||
*/ | |||
public List<String> listRange(String key, long start, long end) { | |||
return redisTemplate.opsForList().range(key, start, end); | |||
} | |||
public Long listSize(String key) { | |||
return redisTemplate.opsForList().size(key); | |||
} | |||
public Boolean hashHasKey(String key, Object hashKey) { | |||
return opsForHash().hasKey(key, hashKey); | |||
} | |||
public Object hashGet(String key, Object hashKey) { | |||
return opsForHash().get(key, hashKey); | |||
} | |||
public void hashPut(String key, Object hashKey, Object value) { | |||
opsForHash().put(key, hashKey, value); | |||
} | |||
public Boolean hashPutIfAbsent(String key, Object hashKey, Object value) { | |||
return opsForHash().putIfAbsent(key, hashKey, value); | |||
} | |||
public void hashPutAll(String key, Map<? extends Object, ? extends Object> m) { | |||
opsForHash().putAll(key, m); | |||
} | |||
public Long hashIncrement(String key, Object hashKey, long delta) { | |||
return opsForHash().increment(key, hashKey, delta); | |||
} | |||
public Long hashDelete(String key, Object... hashKeys) { | |||
return opsForHash().delete(key, hashKeys); | |||
} | |||
public Map<Object, Object> hashScan(String key, String pattern) { | |||
ScanOptionsBuilder b = new ScanOptionsBuilder(); | |||
Cursor<Entry<Object, Object>> s = opsForHash().scan(key, b.match(pattern).build()); | |||
Map<Object, Object> map = new HashMap<>(); | |||
s.forEachRemaining(e -> map.put(e.getKey(), e.getValue())); | |||
return map; | |||
} | |||
public String findStr(String key, int timeout, Supplier<String> valueSupplier) { | |||
String str = get(key); | |||
if (!StringTools.hasText(str)) { | |||
str = valueSupplier.get(); | |||
set(key, str, timeout); | |||
} | |||
return str; | |||
} | |||
public <T extends BaseEntity> T findObj(Class<T> clazz, String key, int timeout, Supplier<T> valueSupplier) { | |||
String jsonStr = (String)get(key); | |||
try { | |||
if (!StringTools.hasText(jsonStr)) { | |||
T obj = valueSupplier.get(); | |||
jsonStr = JsonTools.toJsonStr(obj); | |||
set(key, jsonStr, timeout); | |||
} | |||
return JsonTools.json2Object(jsonStr, clazz); | |||
} catch (IOException e) { | |||
e.printStackTrace(); | |||
return null; | |||
} | |||
} | |||
public <T extends BaseEntity> T findObj(Class<T> clazz, String key) { | |||
String jsonStr = redisTemplate.opsForValue().get(key); | |||
try { | |||
return JsonTools.json2Object(jsonStr, clazz); | |||
} catch (IOException e) { | |||
e.printStackTrace(); | |||
return null; | |||
} | |||
} | |||
public <T> Map<String, T> findMap(Class<T> clazz, String key, int timeout, Supplier<Map<String, T>> valueSupplier) { | |||
String jsonStr = get(key); | |||
try { | |||
if (!StringTools.hasText(jsonStr)) { | |||
Map<String, T> map = valueSupplier.get(); | |||
jsonStr = JsonTools.toJsonStr(map); | |||
set(key, jsonStr, timeout); | |||
} | |||
return JsonTools.json2Map(jsonStr, String.class, clazz); | |||
} catch (IOException e) { | |||
e.printStackTrace(); | |||
return new HashedMap<>(); | |||
} | |||
} | |||
public <T> List<T> findList(Class<T> clazz, String key, int timeout, Supplier<Collection<T>> valueSupplier) { | |||
String jsonStr = get(key); | |||
try { | |||
if (!StringTools.hasText(jsonStr)) { | |||
Collection<T> c = valueSupplier.get(); | |||
jsonStr = JsonTools.toJsonStr(c); | |||
set(key, jsonStr, timeout); | |||
} | |||
return JsonTools.json2List(jsonStr, clazz); | |||
} catch (IOException e) { | |||
e.printStackTrace(); | |||
return new ArrayList<>(); | |||
} | |||
} | |||
public <T extends BaseEntity> Pagination findPagn(Class<T> clazz, String key, int timeout, | |||
Supplier<Pagination> valueSupplier) { | |||
String jsonStr = get(key); | |||
try { | |||
if (!StringTools.hasText(jsonStr)) { | |||
Pagination c = valueSupplier.get(); | |||
jsonStr = JsonTools.toJsonStr(c); | |||
set(key, jsonStr, timeout); | |||
} | |||
return JsonTools.json2Pagn(jsonStr, clazz); | |||
} catch (IOException e) { | |||
e.printStackTrace(); | |||
return new Pagination().setResult(new ArrayList<>()); | |||
} | |||
} | |||
private <HK, HV> HashOperations<String, HK, HV> opsForHash() { | |||
return redisTemplate.opsForHash(); | |||
} | |||
private void set(String key, String value, int timeout) { | |||
redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS); | |||
} | |||
} |
@@ -0,0 +1,9 @@ | |||
package cn.com.taiji.userw.manager.rbac; | |||
import cn.com.taiji.common.manager.net.http.ServiceHandleException; | |||
import cn.com.taiji.userw.dto.rbac.RbacSystemTypeByOpenIdRequestDTO; | |||
import cn.com.taiji.userw.dto.rbac.RbacSystemTypeByOpenIdResponseDTO; | |||
public interface RbacSystemTypeManager { | |||
RbacSystemTypeByOpenIdResponseDTO systemTypeByOpneId(RbacSystemTypeByOpenIdRequestDTO dto) throws ServiceHandleException; | |||
} |
@@ -0,0 +1,57 @@ | |||
package cn.com.taiji.userw.manager.rbac; | |||
import cn.com.taiji.common.manager.net.http.ServiceHandleException; | |||
import cn.com.taiji.core.entity.dict.basic.SourceType; | |||
import cn.com.taiji.core.entity.dict.user.SystemType; | |||
import cn.com.taiji.core.manager.cache.RedisCacheManager; | |||
import cn.com.taiji.core.model.comm.protocol.valid.GlyServiceError; | |||
import cn.com.taiji.core.repo.jpa.user.AccountUserRoleRepo; | |||
import cn.com.taiji.userw.dto.rbac.RbacSystemTypeByOpenIdRequestDTO; | |||
import cn.com.taiji.userw.dto.rbac.RbacSystemTypeByOpenIdResponseDTO; | |||
import cn.com.taiji.userw.dto.rbac.RbacSystemTypeByOpenIdVO; | |||
import org.apache.commons.compress.utils.Lists; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Service; | |||
import java.util.List; | |||
import java.util.stream.Collectors; | |||
@Service | |||
public class RbacSystemTypeManagerImpl extends RedisCacheManager implements RbacSystemTypeManager { | |||
@Autowired | |||
private AccountUserRoleRepo accountUserRoleRepo; | |||
@Override | |||
public RbacSystemTypeByOpenIdResponseDTO systemTypeByOpneId(RbacSystemTypeByOpenIdRequestDTO dto) throws ServiceHandleException { | |||
String openId = findOpenIdByToken(dto.getAccessToken()); | |||
List<RbacSystemTypeByOpenIdVO> list = Lists.newArrayList(); | |||
switch (SourceType.findByCode(dto.getLoginSource())) { | |||
case SERVICE_HALL: | |||
list.add(from(SystemType.APP)); | |||
return new RbacSystemTypeByOpenIdResponseDTO().setList(list); | |||
case ALI: | |||
list.add(from(SystemType.MINI_PROGRAM)); | |||
return new RbacSystemTypeByOpenIdResponseDTO().setList(list); | |||
case WECHAT: | |||
list.add(from(SystemType.ZFB_MINI_PROGRAM)); | |||
return new RbacSystemTypeByOpenIdResponseDTO().setList(list); | |||
case WEB: | |||
List<SystemType> systemTypeList = accountUserRoleRepo.findSystemTypeByOpenId(openId); | |||
if (isEmpty(systemTypeList)) | |||
throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("无访问系统权限"); | |||
list = systemTypeList.stream().filter(e -> e != SystemType.APP && e != SystemType.MINI_PROGRAM && e != SystemType.ZFB_MINI_PROGRAM).map(this::from).collect(Collectors.toList()); | |||
return new RbacSystemTypeByOpenIdResponseDTO().setList(list); | |||
default: | |||
throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("无访问系统权限"); | |||
} | |||
} | |||
private RbacSystemTypeByOpenIdVO from(SystemType type) { | |||
RbacSystemTypeByOpenIdVO vo = new RbacSystemTypeByOpenIdVO(); | |||
vo.setName(type.getName()); | |||
vo.setCode(type.getCode()); | |||
return vo; | |||
} | |||
} |
@@ -31,6 +31,8 @@ spring: | |||
refresh: true | |||
- data-id: comm-client.yaml | |||
refresh: true | |||
- data-id: redis.yaml | |||
refresh: true | |||
- data-id: minio-client.yaml | |||
refresh: true | |||
- data-id: userw-config.yaml |
@@ -5,6 +5,7 @@ import cn.com.taiji.common.manager.AbstractManager; | |||
import cn.com.taiji.common.model.dao.Pagination; | |||
import cn.com.taiji.common.pub.StringTools; | |||
import cn.com.taiji.common.pub.json.JsonTools; | |||
import cn.com.taiji.core.manager.cache.RedisManager; | |||
import org.apache.commons.collections4.map.HashedMap; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.data.redis.core.Cursor; | |||
@@ -29,7 +30,7 @@ import java.util.function.Supplier; | |||
* @version 1.0 | |||
*/ | |||
@Service | |||
public class RedisWrapManager extends AbstractManager { | |||
public class RedisWrapManager extends AbstractManager implements RedisManager { | |||
@Autowired(required = false) | |||
private RedisTemplate<String, String> redisTemplate; |
@@ -1,30 +1,20 @@ | |||
package cn.com.taiji.ias.manager.portal; | |||
import cn.com.taiji.common.manager.AbstractManager; | |||
import cn.com.taiji.common.manager.net.http.ServiceHandleException; | |||
import cn.com.taiji.common.pub.json.JsonTools; | |||
import cn.com.taiji.core.entity.dict.basic.SourceType; | |||
import cn.com.taiji.core.entity.user.AccountInfo; | |||
import cn.com.taiji.core.entity.user.Staff; | |||
import cn.com.taiji.core.manager.cache.RedisCacheManager; | |||
import cn.com.taiji.core.model.comm.protocol.valid.GlyServiceError; | |||
import cn.com.taiji.core.repo.jpa.user.StaffRepo; | |||
import cn.com.taiji.ias.manager.RedisWrapManager; | |||
import cn.com.taiji.ias.model.LoginFinals; | |||
import cn.com.taiji.ias.model.RedisKeyGenerator; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import java.io.IOException; | |||
import java.util.concurrent.TimeUnit; | |||
public abstract class AbstractLoginManager extends AbstractManager { | |||
public abstract class AbstractLoginManager extends RedisCacheManager { | |||
protected final static String commonServiceHallId = "5201010600400000000";// 普通用户的专属网点编号 | |||
protected final static String commonStaffId = "003d875dabaa4390b22739f6897cf570"; | |||
@Autowired | |||
private StaffRepo staffRepo; | |||
@Autowired | |||
protected RedisWrapManager redisManager; | |||
protected Staff findAndValidStaff(String openId, SourceType loginSource) throws ServiceHandleException { | |||
if (loginSource != SourceType.SERVICE_HALL && loginSource != SourceType.WEB) return null; | |||
@@ -39,49 +29,49 @@ public abstract class AbstractLoginManager extends AbstractManager { | |||
return staff; | |||
} | |||
protected void setTokenCache(AccountInfo accountInfo, String accessToken, String agencyId) { | |||
redisManager.set(RedisKeyGenerator.getLoginOpenIdKey(accessToken), accountInfo.getOpenId(), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.set(RedisKeyGenerator.getLoginSourceTypeKey(accessToken), accountInfo.getLoginSource().name(), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.set(RedisKeyGenerator.getLoginAccountInfoKey(accessToken), accountInfo.toJson(), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.set(RedisKeyGenerator.getLoginAgencyIdKey(accessToken), agencyId, LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.set(RedisKeyGenerator.getLoginTokenKey(accountInfo.getOpenId()), accessToken, LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
} | |||
protected void checkTokenCache(String accessToken, String openId, SourceType loginSource) throws ServiceHandleException { | |||
String openIdCache = redisManager.get(RedisKeyGenerator.getLoginOpenIdKey(accessToken)); | |||
if (!hasText(openIdCache)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
if (!openId.equals(openIdCache)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
String loginSourceType = redisManager.get(RedisKeyGenerator.getLoginSourceTypeKey(accessToken)); | |||
if (!hasText(loginSourceType)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
if (!loginSourceType.equals(loginSource.name())) | |||
throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
String accountInfoStr = redisManager.get(RedisKeyGenerator.getLoginAccountInfoKey(accessToken)); | |||
if (!hasText(accountInfoStr)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
AccountInfo accountInfo = null; | |||
try { | |||
accountInfo = JsonTools.json2Object(accountInfoStr, AccountInfo.class); | |||
} catch (IOException e) { | |||
throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效,信息解析失败"); | |||
} | |||
String accessTokenCache = redisManager.get(RedisKeyGenerator.getLoginTokenKey(openId)); | |||
if (!hasText(accessTokenCache)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
if (!accessToken.equals(accessTokenCache)) | |||
throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
} | |||
protected void expireTokenCache(String accessToken, String openId) { | |||
redisManager.expire(RedisKeyGenerator.getLoginOpenIdKey(accessToken), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.expire(RedisKeyGenerator.getLoginSourceTypeKey(accessToken), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.expire(RedisKeyGenerator.getLoginAccountInfoKey(accessToken), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.expire(RedisKeyGenerator.getLoginAgencyIdKey(accessToken), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
redisManager.expire(RedisKeyGenerator.getLoginTokenKey(openId), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
} | |||
protected void deleteTokenCache(String accessToken, String openId) { | |||
redisManager.delete(RedisKeyGenerator.getLoginOpenIdKey(accessToken)); | |||
redisManager.delete(RedisKeyGenerator.getLoginSourceTypeKey(accessToken)); | |||
redisManager.delete(RedisKeyGenerator.getLoginAccountInfoKey(accessToken)); | |||
redisManager.delete(RedisKeyGenerator.getLoginAgencyIdKey(accessToken)); | |||
redisManager.delete(RedisKeyGenerator.getLoginTokenKey(openId)); | |||
} | |||
// protected void setTokenCache(AccountInfo accountInfo, String accessToken, String agencyId) { | |||
// redisManager.set(RedisKeyGenerator.getLoginOpenIdKey(accessToken), accountInfo.getOpenId(), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
// redisManager.set(RedisKeyGenerator.getLoginSourceTypeKey(accessToken), accountInfo.getLoginSource().name(), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
// redisManager.set(RedisKeyGenerator.getLoginAccountInfoKey(accessToken), accountInfo.toJson(), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
// redisManager.set(RedisKeyGenerator.getLoginAgencyIdKey(accessToken), agencyId, LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
// redisManager.set(RedisKeyGenerator.getLoginTokenKey(accountInfo.getOpenId()), accessToken, LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
// } | |||
// | |||
// protected void checkTokenCache(String accessToken, String openId, SourceType loginSource) throws ServiceHandleException { | |||
// String openIdCache = redisManager.get(RedisKeyGenerator.getLoginOpenIdKey(accessToken)); | |||
// if (!hasText(openIdCache)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
// if (!openId.equals(openIdCache)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
// String loginSourceType = redisManager.get(RedisKeyGenerator.getLoginSourceTypeKey(accessToken)); | |||
// if (!hasText(loginSourceType)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
// if (!loginSourceType.equals(loginSource.name())) | |||
// throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
// String accountInfoStr = redisManager.get(RedisKeyGenerator.getLoginAccountInfoKey(accessToken)); | |||
// if (!hasText(accountInfoStr)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
// AccountInfo accountInfo = null; | |||
// try { | |||
// accountInfo = JsonTools.json2Object(accountInfoStr, AccountInfo.class); | |||
// } catch (IOException e) { | |||
// throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效,信息解析失败"); | |||
// } | |||
// String accessTokenCache = redisManager.get(RedisKeyGenerator.getLoginTokenKey(openId)); | |||
// if (!hasText(accessTokenCache)) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
// if (!accessToken.equals(accessTokenCache)) | |||
// throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("Token已失效"); | |||
// } | |||
// | |||
// protected void expireTokenCache(String accessToken, String openId) { | |||
// redisManager.expire(RedisKeyGenerator.getLoginOpenIdKey(accessToken), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
// redisManager.expire(RedisKeyGenerator.getLoginSourceTypeKey(accessToken), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
// redisManager.expire(RedisKeyGenerator.getLoginAccountInfoKey(accessToken), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
// redisManager.expire(RedisKeyGenerator.getLoginAgencyIdKey(accessToken), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
// redisManager.expire(RedisKeyGenerator.getLoginTokenKey(openId), LoginFinals.LOGIN_TOKEN_EXPIRED, TimeUnit.MINUTES); | |||
// } | |||
// | |||
// protected void deleteTokenCache(String accessToken, String openId) { | |||
// redisManager.delete(RedisKeyGenerator.getLoginOpenIdKey(accessToken)); | |||
// redisManager.delete(RedisKeyGenerator.getLoginSourceTypeKey(accessToken)); | |||
// redisManager.delete(RedisKeyGenerator.getLoginAccountInfoKey(accessToken)); | |||
// redisManager.delete(RedisKeyGenerator.getLoginAgencyIdKey(accessToken)); | |||
// redisManager.delete(RedisKeyGenerator.getLoginTokenKey(openId)); | |||
// } | |||
} |
@@ -10,8 +10,9 @@ import org.springframework.stereotype.Service; | |||
public class AccessTokenCheckManager extends AbstractLoginManager { | |||
public AccessTokenCheckResponse serviceHandle(AccessTokenCheckRequest request) throws ServiceHandleException { | |||
checkTokenCache(request.getAccessToken(), request.getOpenId(), request.getLoginSource()); | |||
expireTokenCache(request.getAccessToken(), request.getOpenId()); | |||
String openId = findOpenIdByToken(request.getAccessToken()); | |||
checkTokenCache(request.getAccessToken(), openId, request.getLoginSource()); | |||
expireTokenCache(request.getAccessToken(), openId); | |||
AccessTokenCheckResponse response = new AccessTokenCheckResponse(); | |||
response.setInfo("验证成功,Token尚且有效"); | |||
return response; |
@@ -11,15 +11,17 @@ public class LogoutManager extends AbstractLoginManager { | |||
public LogoutResponse serviceHandle(LogoutRequest request) { | |||
try { | |||
checkTokenCache(request.getAccessToken(), request.getOpenId(), request.getLoginSource()); | |||
String openId = findOpenIdByToken(request.getAccessToken()); | |||
checkTokenCache(request.getAccessToken(), openId, request.getLoginSource()); | |||
deleteTokenCache(request.getAccessToken(), openId); | |||
LogoutResponse response = new LogoutResponse(); | |||
response.setInfo("退出成功"); | |||
return response; | |||
} catch (ServiceHandleException e) { | |||
logger.info("Token失效退出"); | |||
LogoutResponse response = new LogoutResponse(); | |||
response.setInfo("退出成功"); | |||
return response; | |||
} | |||
deleteTokenCache(request.getAccessToken(), request.getOpenId()); | |||
LogoutResponse response = new LogoutResponse(); | |||
response.setInfo("退出成功"); | |||
return response; | |||
} | |||
} |
@@ -4,6 +4,8 @@ import cn.com.taiji.core.model.comm.protocol.AbstractReqIdTypeRequest; | |||
import cn.com.taiji.core.model.comm.protocol.ias.message.dto.FileVo; | |||
import cn.com.taiji.core.model.comm.protocol.ias.message.dto.MIMEMultipartTypeEnum; | |||
import lombok.Data; | |||
import lombok.Getter; | |||
import lombok.Setter; | |||
import java.util.List; | |||
@@ -13,7 +15,8 @@ import java.util.List; | |||
* @Description 邮件接口参数 | |||
*/ | |||
@Data | |||
@Getter | |||
@Setter | |||
public class EmailRequest extends AbstractReqIdTypeRequest { | |||
private String email; | |||
private String subject; |