This commit is contained in:
pikachu1995@126.com 2023-02-16 18:16:43 +08:00
commit 013e8f8f70
7 changed files with 76 additions and 67 deletions

View File

@ -2,6 +2,7 @@ package cn.lili.common.security;
import cn.lili.common.security.enums.UserEnums;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -13,6 +14,7 @@ import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AuthUser implements Serializable {
private static final long serialVersionUID = 582441893336003319L;
@ -84,22 +86,5 @@ public class AuthUser implements Serializable {
this.nickName = nickName;
}
public AuthUser(String username, String id, String face, UserEnums manager, String nickName, Boolean isSuper) {
this.username = username;
this.id = id;
this.face = face;
this.role = manager;
this.isSuper = isSuper;
this.nickName = nickName;
}
public AuthUser(String username, String id, UserEnums manager, String nickName, Boolean isSuper, String clerkId, String face) {
this.username = username;
this.id = id;
this.role = manager;
this.isSuper = isSuper;
this.nickName = nickName;
this.clerkId = clerkId;
this.face = face;
}
}

View File

@ -4,10 +4,10 @@ import cn.lili.cache.Cache;
import cn.lili.cache.CachePrefix;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.JWTTokenProperties;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.enums.SecurityEnum;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.properties.JWTTokenProperties;
import com.google.gson.Gson;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.SignatureException;
@ -34,24 +34,21 @@ public class TokenUtil {
/**
* 构建token
*
* @param username 主体
* @param claim 私有声明
* @param longTerm 长时间特殊token 移动端微信小程序等
* @param userEnums 用户枚举
* @param authUser 私有声明
* @return TOKEN
*/
public Token createToken(String username, Object claim, boolean longTerm, UserEnums userEnums) {
public Token createToken(AuthUser authUser) {
Token token = new Token();
//访问token
String accessToken = createToken(username, claim, tokenProperties.getTokenExpireTime());
String accessToken = createToken(authUser, tokenProperties.getTokenExpireTime());
cache.put(CachePrefix.ACCESS_TOKEN.getPrefix(userEnums) + accessToken, 1,
cache.put(CachePrefix.ACCESS_TOKEN.getPrefix(authUser.getRole()) + accessToken, 1,
tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES);
//刷新token生成策略如果是长时间有效的token用于app则默认15天有效期刷新token如果是普通用户登录则刷新token为普通token2倍数
Long expireTime = longTerm ? 15 * 24 * 60L : tokenProperties.getTokenExpireTime() * 2;
String refreshToken = createToken(username, claim, expireTime);
Long expireTime = authUser.getLongTerm() ? 15 * 24 * 60L : tokenProperties.getTokenExpireTime() * 2;
String refreshToken = createToken(authUser, expireTime);
cache.put(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums) + refreshToken, 1, expireTime, TimeUnit.MINUTES);
cache.put(CachePrefix.REFRESH_TOKEN.getPrefix(authUser.getRole()) + refreshToken, 1, expireTime, TimeUnit.MINUTES);
token.setAccessToken(accessToken);
token.setRefreshToken(refreshToken);
@ -62,17 +59,17 @@ public class TokenUtil {
* 刷新token
*
* @param oldRefreshToken 刷新token
* @param userEnums 用户枚举
* @return token
*/
public Token refreshToken(String oldRefreshToken, UserEnums userEnums) {
public Token refreshToken(String oldRefreshToken) {
Claims claims;
try {
claims = Jwts.parser()
.setSigningKey(SecretKeyUtil.generalKeyByDecoders())
.parseClaimsJws(oldRefreshToken).getBody();
} catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | SignatureException | IllegalArgumentException e) {
} catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | SignatureException |
IllegalArgumentException e) {
//token 过期 认证失败等
throw new ServiceException(ResultCode.USER_AUTH_EXPIRED);
}
@ -80,7 +77,7 @@ public class TokenUtil {
//获取存储在claims中的用户信息
String json = claims.get(SecurityEnum.USER_CONTEXT.getValue()).toString();
AuthUser authUser = new Gson().fromJson(json, AuthUser.class);
UserEnums userEnums = authUser.getRole();
String username = authUser.getUsername();
//获取是否长期有效的token
@ -91,17 +88,18 @@ public class TokenUtil {
if (cache.hasKey(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums) + oldRefreshToken)) {
Token token = new Token();
//访问token
String accessToken = createToken(username, authUser, tokenProperties.getTokenExpireTime());
String accessToken = createToken(authUser, tokenProperties.getTokenExpireTime());
cache.put(CachePrefix.ACCESS_TOKEN.getPrefix(userEnums) + accessToken, 1, tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES);
//如果是信任登录设备则刷新token长度继续延长
Long expirationTime = tokenProperties.getTokenExpireTime() * 2;
if (longTerm) {
expirationTime = 60 * 24 * 15L;
authUser.setLongTerm(true);
}
//刷新token生成策略如果是长时间有效的token用于app则默认15天有效期刷新token如果是普通用户登录则刷新token为普通token2倍数
String refreshToken = createToken(username, authUser, expirationTime);
String refreshToken = createToken(authUser, expirationTime);
cache.put(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums) + refreshToken, 1, expirationTime, TimeUnit.MINUTES);
token.setAccessToken(accessToken);
@ -117,18 +115,17 @@ public class TokenUtil {
/**
* 生成token
*
* @param username 主体
* @param claim 私有神明内容
* @param authUser jwt主体对象
* @param expirationTime 过期时间分钟
* @return token字符串
*/
private String createToken(String username, Object claim, Long expirationTime) {
private String createToken(AuthUser authUser, Long expirationTime) {
//JWT 生成
return Jwts.builder()
//jwt 私有声明
.claim(SecurityEnum.USER_CONTEXT.getValue(), new Gson().toJson(claim))
.claim(SecurityEnum.USER_CONTEXT.getValue(), new Gson().toJson(authUser))
//JWT的主体
.setSubject(username)
.setSubject(authUser.getUsername())
//失效时间 当前时间+过期分钟
.setExpiration(new Date(System.currentTimeMillis() + expirationTime * 60 * 1000))
//签名算法和密钥

View File

@ -23,20 +23,23 @@ public class SeatTokenGenerate extends AbstractTokenGenerate<Seat> {
@Override
public Token createToken(Seat seat, Boolean longTerm) {
AuthUser authUser = new AuthUser(
seat.getUsername(),
seat.getId(),
seat.getNickName(),
seat.getFace(),
UserEnums.SEAT);
authUser.setTenantId(seat.getTenantId());
AuthUser authUser = AuthUser.builder()
.username(seat.getUsername())
.id(seat.getId())
.nickName(seat.getNickName())
.face(seat.getFace())
.role(UserEnums.SEAT)
.longTerm(longTerm)
.tenantId(seat.getTenantId())
.build();
//登陆成功生成token
return tokenUtil.createToken(seat.getUsername(), authUser, longTerm, UserEnums.SEAT);
return tokenUtil.createToken(authUser);
}
@Override
public Token refreshToken(String refreshToken) {
return tokenUtil.refreshToken(refreshToken, UserEnums.SEAT);
return tokenUtil.refreshToken(refreshToken);
}
}

View File

@ -57,14 +57,21 @@ public class MemberTokenGenerate extends AbstractTokenGenerate<Member> {
String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_LOGIN.name();
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
AuthUser authUser = new AuthUser(member.getUsername(), member.getId(), member.getNickName(), member.getFace(), UserEnums.MEMBER);
AuthUser authUser = AuthUser.builder()
.username(member.getUsername())
.face(member.getFace())
.id(member.getId())
.role(UserEnums.MEMBER)
.nickName(member.getNickName())
.longTerm(longTerm)
.build();
//登陆成功生成token
return tokenUtil.createToken(member.getUsername(), authUser, longTerm, UserEnums.MEMBER);
return tokenUtil.createToken(authUser);
}
@Override
public Token refreshToken(String refreshToken) {
return tokenUtil.refreshToken(refreshToken, UserEnums.MEMBER);
return tokenUtil.refreshToken(refreshToken);
}
}

View File

@ -11,16 +11,16 @@ import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.security.token.Token;
import cn.lili.common.security.token.TokenUtil;
import cn.lili.common.security.token.base.AbstractTokenGenerate;
import cn.lili.modules.member.entity.dos.Clerk;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.vo.StoreUserMenuVO;
import cn.lili.modules.member.service.ClerkService;
import cn.lili.modules.member.service.StoreMenuRoleService;
import cn.lili.modules.store.entity.dos.Store;
import cn.lili.modules.store.service.StoreService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import cn.lili.modules.member.entity.dos.Clerk;
import cn.lili.modules.member.entity.vo.StoreUserMenuVO;
import cn.lili.modules.member.service.ClerkService;
import cn.lili.modules.member.service.StoreMenuRoleService;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -61,7 +61,7 @@ public class StoreTokenGenerate extends AbstractTokenGenerate<Member> {
throw new ServiceException(ResultCode.CLERK_DISABLED_ERROR);
}
//获取当前用户权限
List<StoreUserMenuVO> storeUserMenuVOS = storeMenuRoleService.findAllMenu(clerk.getId(),member.getId());
List<StoreUserMenuVO> storeUserMenuVOS = storeMenuRoleService.findAllMenu(clerk.getId(), member.getId());
//缓存权限列表
cache.put(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.STORE) + member.getId(), this.permissionList(storeUserMenuVOS));
//查询店铺信息
@ -69,16 +69,25 @@ public class StoreTokenGenerate extends AbstractTokenGenerate<Member> {
if (store == null) {
throw new ServiceException(ResultCode.STORE_NOT_OPEN);
}
AuthUser authUser = new AuthUser(member.getUsername(), member.getId(), UserEnums.STORE, member.getNickName(), clerk.getIsSuper(), clerk.getId(),store.getStoreLogo());
authUser.setStoreId(store.getId());
authUser.setStoreName(store.getStoreName());
return tokenUtil.createToken(member.getUsername(), authUser, longTerm, UserEnums.STORE);
//构建对象
AuthUser authUser = AuthUser.builder()
.username(member.getUsername())
.id(member.getId())
.role(UserEnums.STORE)
.nickName(member.getNickName())
.isSuper(clerk.getIsSuper())
.clerkId(clerk.getId())
.face(store.getStoreLogo())
.storeId(store.getId())
.storeName(store.getStoreName())
.longTerm(longTerm)
.build();
return tokenUtil.createToken(authUser);
}
@Override
public Token refreshToken(String refreshToken) {
return tokenUtil.refreshToken(refreshToken, UserEnums.STORE);
return tokenUtil.refreshToken(refreshToken);
}
/**
@ -145,7 +154,6 @@ public class StoreTokenGenerate extends AbstractTokenGenerate<Member> {
superPermissions.add("/store/passport/login*");
//店铺设置
queryPermissions.add("/store/settings/storeSettings*");
//文章接口
@ -154,6 +162,5 @@ public class StoreTokenGenerate extends AbstractTokenGenerate<Member> {
queryPermissions.add("/store/statistics/index*");
}
}

View File

@ -40,18 +40,26 @@ public class ManagerTokenGenerate extends AbstractTokenGenerate<AdminUser> {
@Override
public Token createToken(AdminUser adminUser, Boolean longTerm) {
AuthUser authUser = new AuthUser(adminUser.getUsername(), adminUser.getId(), adminUser.getAvatar(), UserEnums.MANAGER, adminUser.getNickName(), adminUser.getIsSuper());
AuthUser authUser = AuthUser.builder()
.username(adminUser.getUsername())
.id(adminUser.getId())
.face(adminUser.getAvatar())
.role(UserEnums.MANAGER)
.nickName(adminUser.getNickName())
.isSuper(adminUser.getIsSuper())
.longTerm(longTerm)
.build();
List<UserMenuVO> userMenuVOList = roleMenuService.findAllMenu(authUser.getId());
//缓存权限列表
cache.put(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.MANAGER) + authUser.getId(), this.permissionList(userMenuVOList));
return tokenUtil.createToken(adminUser.getUsername(), authUser, longTerm, UserEnums.MANAGER);
return tokenUtil.createToken(authUser);
}
@Override
public Token refreshToken(String refreshToken) {
return tokenUtil.refreshToken(refreshToken, UserEnums.MANAGER);
return tokenUtil.refreshToken(refreshToken);
}
/**

View File

@ -0,0 +1,2 @@
package cn.lili.controller.security;public class Cop {
}