【7.6.0】【框架改造】【auth】【jwt】减小jwt的职责,jwt模块保持独立

pull/55/head
fengshuonan 2023-05-09 10:19:54 +08:00
parent cd146aeaf1
commit 53b4123094
19 changed files with 139 additions and 136 deletions

View File

@ -22,42 +22,36 @@
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.jwt.starter;
package cn.stylefeng.roses.kernel.auth.api;
import cn.stylefeng.roses.kernel.jwt.JwtTokenOperator;
import cn.stylefeng.roses.kernel.jwt.api.JwtApi;
import cn.stylefeng.roses.kernel.jwt.api.expander.JwtConfigExpander;
import cn.stylefeng.roses.kernel.jwt.api.pojo.config.JwtConfig;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import cn.stylefeng.roses.kernel.auth.api.pojo.payload.DefaultJwtPayload;
/**
* jwt
* Authjwt使
*
* @author fengshuonan
* @since 2020/12/1 14:34
* @since 2023/5/9 10:04
*/
@Configuration
public class GunsJwtAutoConfiguration {
public interface AuthJwtTokenApi {
/**
* jwt
* tokenpayload
*
* @param defaultJwtPayload jwt
* @return jwt token
* @author fengshuonan
* @since 2020/12/1 14:40
* @since 2020/10/21 11:38
*/
@Bean
@ConditionalOnMissingBean(JwtApi.class)
public JwtApi jwtApi() {
String generateTokenDefaultPayload(DefaultJwtPayload defaultJwtPayload);
JwtConfig jwtConfig = new JwtConfig();
// 从系统配置表中读取配置
jwtConfig.setJwtSecret(JwtConfigExpander.getJwtSecret());
jwtConfig.setExpiredSeconds(JwtConfigExpander.getJwtTimeoutSeconds());
return new JwtTokenOperator(jwtConfig);
}
/**
* jwtpayload
*
* @param token jwttoken
* @return payload
* @author fengshuonan
* @since 2020/10/21 11:51
*/
DefaultJwtPayload getDefaultPayload(String token);
}

View File

@ -29,7 +29,7 @@ import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginRequest;
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginResponse;
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginWithTokenRequest;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.jwt.api.pojo.payload.DefaultJwtPayload;
import cn.stylefeng.roses.kernel.auth.api.pojo.payload.DefaultJwtPayload;
/**
* 退token

View File

@ -22,10 +22,10 @@
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.jwt.api.context;
package cn.stylefeng.roses.kernel.auth.api.context;
import cn.hutool.extra.spring.SpringUtil;
import cn.stylefeng.roses.kernel.jwt.api.JwtApi;
import cn.stylefeng.roses.kernel.auth.api.AuthJwtTokenApi;
/**
* Jwtcontextjwt
@ -33,7 +33,7 @@ import cn.stylefeng.roses.kernel.jwt.api.JwtApi;
* @author fengshuonan
* @since 2020/10/21 14:07
*/
public class JwtContext {
public class AuthJwtContext {
/**
* jwt
@ -41,8 +41,8 @@ public class JwtContext {
* @author fengshuonan
* @since 2020/10/21 14:07
*/
public static JwtApi me() {
return SpringUtil.getBean(JwtApi.class);
public static AuthJwtTokenApi me() {
return SpringUtil.getBean(AuthJwtTokenApi.class);
}
}

View File

@ -22,7 +22,7 @@
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.jwt.api.expander;
package cn.stylefeng.roses.kernel.auth.api.expander;
import cn.hutool.core.util.RandomUtil;
import cn.stylefeng.roses.kernel.config.api.context.ConfigContext;

View File

@ -22,7 +22,7 @@
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.jwt.api.pojo.payload;
package cn.stylefeng.roses.kernel.auth.api.pojo.payload;
import cn.hutool.core.util.IdUtil;
import lombok.Data;

View File

@ -40,6 +40,7 @@ import cn.stylefeng.roses.kernel.auth.api.SsoServerApi;
import cn.stylefeng.roses.kernel.auth.api.TempSecretApi;
import cn.stylefeng.roses.kernel.auth.api.constants.AuthConstants;
import cn.stylefeng.roses.kernel.auth.api.constants.LoginCacheConstants;
import cn.stylefeng.roses.kernel.auth.api.context.AuthJwtContext;
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
import cn.stylefeng.roses.kernel.auth.api.enums.SsoClientTypeEnum;
import cn.stylefeng.roses.kernel.auth.api.exception.AuthException;
@ -51,6 +52,7 @@ import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginRequest;
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginResponse;
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginWithTokenRequest;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.auth.api.pojo.payload.DefaultJwtPayload;
import cn.stylefeng.roses.kernel.auth.api.pojo.sso.SsoLoginCodeRequest;
import cn.stylefeng.roses.kernel.auth.api.pojo.sso.SsoProperties;
import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
@ -58,11 +60,10 @@ import cn.stylefeng.roses.kernel.demo.expander.DemoConfigExpander;
import cn.stylefeng.roses.kernel.dsctn.api.constants.DatasourceContainerConstants;
import cn.stylefeng.roses.kernel.dsctn.api.context.CurrentDataSourceContext;
import cn.stylefeng.roses.kernel.jwt.JwtTokenOperator;
import cn.stylefeng.roses.kernel.jwt.api.context.JwtContext;
import cn.stylefeng.roses.kernel.jwt.api.JwtApi;
import cn.stylefeng.roses.kernel.jwt.api.exception.JwtException;
import cn.stylefeng.roses.kernel.jwt.api.exception.enums.JwtExceptionEnum;
import cn.stylefeng.roses.kernel.jwt.api.pojo.config.JwtConfig;
import cn.stylefeng.roses.kernel.jwt.api.pojo.payload.DefaultJwtPayload;
import cn.stylefeng.roses.kernel.log.api.LoginLogServiceApi;
import cn.stylefeng.roses.kernel.message.api.expander.WebSocketConfigExpander;
import cn.stylefeng.roses.kernel.rule.constants.RuleConstants;
@ -130,6 +131,9 @@ public class AuthServiceImpl implements AuthServiceApi {
@Resource(name = "caClientTokenCacheApi")
private CacheOperatorApi<String> caClientTokenCacheApi;
@Resource
private JwtApi jwtApi;
@Override
public LoginResponse login(LoginRequest loginRequest) {
return loginAction(loginRequest, true, null);
@ -225,10 +229,10 @@ public class AuthServiceImpl implements AuthServiceApi {
public DefaultJwtPayload validateToken(String token) throws AuthException {
try {
// 1. 先校验jwt token本身是否有问题
JwtContext.me().validateTokenWithException(token);
jwtApi.validateTokenWithException(token);
// 2. 获取jwt的payload
DefaultJwtPayload defaultPayload = JwtContext.me().getDefaultPayload(token);
DefaultJwtPayload defaultPayload = AuthJwtContext.me().getDefaultPayload(token);
// 3. 如果是7天免登陆则不校验session过期
if (defaultPayload.getRememberMe()) {
@ -412,7 +416,7 @@ public class AuthServiceImpl implements AuthServiceApi {
// 9. 生成用户的token
DefaultJwtPayload defaultJwtPayload = new DefaultJwtPayload(loginUser.getUserId(), loginUser.getAccount(), loginRequest.getRememberMe(), caToken, loginRequest.getTenantCode());
String jwtToken = JwtContext.me().generateTokenDefaultPayload(defaultJwtPayload);
String jwtToken = AuthJwtContext.me().generateTokenDefaultPayload(defaultJwtPayload);
loginUser.setToken(jwtToken);
// 如果包含租户编码则放到loginUser中

View File

@ -0,0 +1,56 @@
package cn.stylefeng.roses.kernel.auth.jwt;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.stylefeng.roses.kernel.auth.api.AuthJwtTokenApi;
import cn.stylefeng.roses.kernel.auth.api.expander.JwtConfigExpander;
import cn.stylefeng.roses.kernel.auth.api.pojo.payload.DefaultJwtPayload;
import cn.stylefeng.roses.kernel.jwt.api.JwtApi;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.Map;
/**
* AuthJWT token使
*
* @author fengshuonan
* @since 2023/5/9 10:05
*/
@Service
public class AuthJwtTokenService implements AuthJwtTokenApi {
@Resource
private JwtApi jwtApi;
@Override
public String generateTokenDefaultPayload(DefaultJwtPayload defaultJwtPayload) {
// 计算过期时间
DateTime expirationDate = DateUtil.offsetSecond(new Date(), Convert.toInt(JwtConfigExpander.getJwtTimeoutSeconds()));
// 设置过期时间
defaultJwtPayload.setExpirationDate(expirationDate.getTime());
// 构造jwt token
return Jwts.builder()
.setClaims(BeanUtil.beanToMap(defaultJwtPayload))
.setSubject(defaultJwtPayload.getUserId().toString())
.setIssuedAt(new Date())
.setExpiration(expirationDate)
.signWith(SignatureAlgorithm.HS512, JwtConfigExpander.getJwtSecret())
.compact();
}
@Override
public DefaultJwtPayload getDefaultPayload(String token) {
Map<String, Object> jwtPayload = jwtApi.getJwtPayloadClaims(token);
return BeanUtil.toBeanIgnoreError(jwtPayload, DefaultJwtPayload.class);
}
}

View File

@ -0,0 +1,37 @@
package cn.stylefeng.roses.kernel.auth.starter;
import cn.stylefeng.roses.kernel.auth.api.expander.JwtConfigExpander;
import cn.stylefeng.roses.kernel.jwt.JwtTokenOperator;
import cn.stylefeng.roses.kernel.jwt.api.JwtApi;
import cn.stylefeng.roses.kernel.jwt.api.pojo.config.JwtConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Authjwt
*
* @author fengshuonan
* @since 2023/5/9 10:07
*/
@Configuration
public class AuthJwtConfigAutoConfiguration {
/**
* jwt
*
* @author fengshuonan
* @since 2020/12/1 14:40
*/
@Bean
public JwtApi jwtApi() {
JwtConfig jwtConfig = new JwtConfig();
// 从系统配置表中读取配置
jwtConfig.setJwtSecret(JwtConfigExpander.getJwtSecret());
jwtConfig.setExpiredSeconds(JwtConfigExpander.getJwtTimeoutSeconds());
return new JwtTokenOperator(jwtConfig);
}
}

View File

@ -17,13 +17,6 @@
<dependencies>
<!--config模块的api-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>config-api</artifactId>
<version>${roses.version}</version>
</dependency>
<!--jwt token-->
<dependency>
<groupId>io.jsonwebtoken</groupId>

View File

@ -25,7 +25,6 @@
package cn.stylefeng.roses.kernel.jwt.api;
import cn.stylefeng.roses.kernel.jwt.api.exception.JwtException;
import cn.stylefeng.roses.kernel.jwt.api.pojo.payload.DefaultJwtPayload;
import java.util.Map;
@ -47,16 +46,6 @@ public interface JwtApi {
*/
String generateToken(Map<String, Object> payload);
/**
* tokenpayload
*
* @param defaultJwtPayload jwt
* @return jwt token
* @author fengshuonan
* @since 2020/10/21 11:38
*/
String generateTokenDefaultPayload(DefaultJwtPayload defaultJwtPayload);
/**
* jwtpayload
*
@ -67,16 +56,6 @@ public interface JwtApi {
*/
Map<String, Object> getJwtPayloadClaims(String token);
/**
* jwtpayload
*
* @param token jwttoken
* @return payload
* @author fengshuonan
* @since 2020/10/21 11:51
*/
DefaultJwtPayload getDefaultPayload(String token);
/**
* jwt token
* <p>

View File

@ -24,7 +24,6 @@
*/
package cn.stylefeng.roses.kernel.jwt;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
@ -32,7 +31,6 @@ import cn.stylefeng.roses.kernel.jwt.api.JwtApi;
import cn.stylefeng.roses.kernel.jwt.api.exception.JwtException;
import cn.stylefeng.roses.kernel.jwt.api.exception.enums.JwtExceptionEnum;
import cn.stylefeng.roses.kernel.jwt.api.pojo.config.JwtConfig;
import cn.stylefeng.roses.kernel.jwt.api.pojo.payload.DefaultJwtPayload;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
@ -72,25 +70,6 @@ public class JwtTokenOperator implements JwtApi {
.compact();
}
@Override
public String generateTokenDefaultPayload(DefaultJwtPayload defaultJwtPayload) {
// 计算过期时间
DateTime expirationDate = DateUtil.offsetSecond(new Date(), Convert.toInt(jwtConfig.getExpiredSeconds()));
// 设置过期时间
defaultJwtPayload.setExpirationDate(expirationDate.getTime());
// 构造jwt token
return Jwts.builder()
.setClaims(BeanUtil.beanToMap(defaultJwtPayload))
.setSubject(defaultJwtPayload.getUserId().toString())
.setIssuedAt(new Date())
.setExpiration(expirationDate)
.signWith(SignatureAlgorithm.HS512, jwtConfig.getJwtSecret())
.compact();
}
@Override
public Claims getJwtPayloadClaims(String token) {
return Jwts.parser()
@ -99,12 +78,6 @@ public class JwtTokenOperator implements JwtApi {
.getBody();
}
@Override
public DefaultJwtPayload getDefaultPayload(String token) {
Map<String, Object> jwtPayload = getJwtPayloadClaims(token);
return BeanUtil.toBeanIgnoreError(jwtPayload, DefaultJwtPayload.class);
}
@Override
public boolean validateToken(String token) {
try {

View File

@ -1 +0,0 @@
jwt功能的spring boot自动加载模块

View File

@ -1,29 +0,0 @@
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>kernel-d-jwt</artifactId>
<version>7.6.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>jwt-spring-boot-starter</artifactId>
<packaging>jar</packaging>
<dependencies>
<!--jwt的sdk-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>jwt-sdk</artifactId>
<version>${roses.version}</version>
</dependency>
</dependencies>
</project>

View File

@ -1,2 +0,0 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.stylefeng.roses.kernel.jwt.starter.GunsJwtAutoConfiguration

View File

@ -18,7 +18,6 @@
<modules>
<module>jwt-api</module>
<module>jwt-sdk</module>
<module>jwt-spring-boot-starter</module>
</modules>
<dependencies>

View File

@ -37,7 +37,7 @@
<!--jwt模块的sdk-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>jwt-sdk</artifactId>
<artifactId>auth-api</artifactId>
<version>${roses.version}</version>
</dependency>
</dependencies>

View File

@ -1,8 +1,8 @@
package cn.stylefeng.roses.kernel.socket.business.websocket.server;
import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.jwt.api.context.JwtContext;
import cn.stylefeng.roses.kernel.jwt.api.pojo.payload.DefaultJwtPayload;
import cn.stylefeng.roses.kernel.auth.api.context.AuthJwtContext;
import cn.stylefeng.roses.kernel.auth.api.pojo.payload.DefaultJwtPayload;
import cn.stylefeng.roses.kernel.socket.api.enums.ClientMessageTypeEnum;
import cn.stylefeng.roses.kernel.socket.api.enums.ServerMessageTypeEnum;
import cn.stylefeng.roses.kernel.socket.api.enums.SystemMessageTypeEnum;
@ -46,7 +46,7 @@ public class WebSocketServer {
String userId = null;
try {
// 解析用户信息
DefaultJwtPayload defaultPayload = JwtContext.me().getDefaultPayload(token);
DefaultJwtPayload defaultPayload = AuthJwtContext.me().getDefaultPayload(token);
userId = defaultPayload.getUserId().toString();
} catch (io.jsonwebtoken.JwtException e) {
try {

View File

@ -8,6 +8,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi;
import cn.stylefeng.roses.kernel.auth.api.context.AuthJwtContext;
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
import cn.stylefeng.roses.kernel.auth.api.exception.AuthException;
import cn.stylefeng.roses.kernel.auth.api.exception.enums.AuthExceptionEnum;
@ -16,6 +17,7 @@ import cn.stylefeng.roses.kernel.auth.api.password.PasswordStoredEncryptApi;
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginRequest;
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginResponse;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.auth.api.pojo.payload.DefaultJwtPayload;
import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
import cn.stylefeng.roses.kernel.customer.api.OldPasswordValidateApi;
import cn.stylefeng.roses.kernel.customer.api.constants.CustomerConstants;
@ -37,8 +39,6 @@ import cn.stylefeng.roses.kernel.email.api.pojo.SendMailParam;
import cn.stylefeng.roses.kernel.file.api.FileInfoApi;
import cn.stylefeng.roses.kernel.file.api.FileOperatorApi;
import cn.stylefeng.roses.kernel.file.api.pojo.response.SysFileInfoResponse;
import cn.stylefeng.roses.kernel.jwt.api.context.JwtContext;
import cn.stylefeng.roses.kernel.jwt.api.pojo.payload.DefaultJwtPayload;
import cn.stylefeng.roses.kernel.log.api.LoginLogServiceApi;
import cn.stylefeng.roses.kernel.rule.enums.StatusEnum;
import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum;
@ -202,7 +202,7 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
// 生成用户的token
DefaultJwtPayload defaultJwtPayload = new DefaultJwtPayload(loginUser.getUserId(), loginUser.getAccount(), loginRequest.getRememberMe(), null, null);
String jwtToken = JwtContext.me().generateTokenDefaultPayload(defaultJwtPayload);
String jwtToken = AuthJwtContext.me().generateTokenDefaultPayload(defaultJwtPayload);
loginUser.setToken(jwtToken);
synchronized (SESSION_OPERATE_LOCK) {

View File

@ -31,6 +31,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi;
import cn.stylefeng.roses.kernel.auth.api.constants.LoginCacheConstants;
import cn.stylefeng.roses.kernel.auth.api.context.AuthJwtContext;
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
import cn.stylefeng.roses.kernel.auth.api.enums.DataScopeTypeEnum;
import cn.stylefeng.roses.kernel.auth.api.exception.enums.AuthExceptionEnum;
@ -38,6 +39,7 @@ import cn.stylefeng.roses.kernel.auth.api.expander.AuthConfigExpander;
import cn.stylefeng.roses.kernel.auth.api.password.PasswordStoredEncryptApi;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleUserInfo;
import cn.stylefeng.roses.kernel.auth.api.pojo.payload.DefaultJwtPayload;
import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
@ -45,8 +47,6 @@ import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import cn.stylefeng.roses.kernel.expand.modular.api.ExpandApi;
import cn.stylefeng.roses.kernel.file.api.FileInfoApi;
import cn.stylefeng.roses.kernel.file.api.constants.FileConstants;
import cn.stylefeng.roses.kernel.jwt.api.context.JwtContext;
import cn.stylefeng.roses.kernel.jwt.api.pojo.payload.DefaultJwtPayload;
import cn.stylefeng.roses.kernel.message.api.expander.WebSocketConfigExpander;
import cn.stylefeng.roses.kernel.office.api.OfficeExcelApi;
import cn.stylefeng.roses.kernel.office.api.pojo.report.ExcelExportParam;
@ -689,7 +689,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
// 生成用户的token
DefaultJwtPayload defaultJwtPayload = new DefaultJwtPayload(loginUser.getUserId(), loginUser.getAccount(), false, null, null);
String jwtToken = JwtContext.me().generateTokenDefaultPayload(defaultJwtPayload);
String jwtToken = AuthJwtContext.me().generateTokenDefaultPayload(defaultJwtPayload);
loginUser.setToken(jwtToken);
synchronized (this) {