mirror of https://gitee.com/stylefeng/roses
【7.6.0】【框架改造】【auth】【jwt】减小jwt的职责,jwt模块保持独立
parent
cd146aeaf1
commit
53b4123094
|
@ -22,42 +22,36 @@
|
||||||
* 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns
|
* 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns
|
||||||
* 6.若您的项目无法满足以上几点,可申请商业授权
|
* 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.auth.api.pojo.payload.DefaultJwtPayload;
|
||||||
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;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* jwt的自动配置
|
* Auth模块对jwt的使用的封装
|
||||||
*
|
*
|
||||||
* @author fengshuonan
|
* @author fengshuonan
|
||||||
* @since 2020/12/1 14:34
|
* @since 2023/5/9 10:04
|
||||||
*/
|
*/
|
||||||
@Configuration
|
public interface AuthJwtTokenApi {
|
||||||
public class GunsJwtAutoConfiguration {
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* jwt操作工具类的配置
|
* 生成token,用默认的payload格式
|
||||||
*
|
*
|
||||||
|
* @param defaultJwtPayload jwt的载体信息
|
||||||
|
* @return jwt token
|
||||||
* @author fengshuonan
|
* @author fengshuonan
|
||||||
* @since 2020/12/1 14:40
|
* @since 2020/10/21 11:38
|
||||||
*/
|
*/
|
||||||
@Bean
|
String generateTokenDefaultPayload(DefaultJwtPayload defaultJwtPayload);
|
||||||
@ConditionalOnMissingBean(JwtApi.class)
|
|
||||||
public JwtApi jwtApi() {
|
|
||||||
|
|
||||||
JwtConfig jwtConfig = new JwtConfig();
|
/**
|
||||||
|
* 获取jwt的payload(限定默认格式)
|
||||||
// 从系统配置表中读取配置
|
*
|
||||||
jwtConfig.setJwtSecret(JwtConfigExpander.getJwtSecret());
|
* @param token jwt的token
|
||||||
jwtConfig.setExpiredSeconds(JwtConfigExpander.getJwtTimeoutSeconds());
|
* @return 返回默认格式的payload
|
||||||
|
* @author fengshuonan
|
||||||
return new JwtTokenOperator(jwtConfig);
|
* @since 2020/10/21 11:51
|
||||||
}
|
*/
|
||||||
|
DefaultJwtPayload getDefaultPayload(String token);
|
||||||
|
|
||||||
}
|
}
|
|
@ -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.LoginResponse;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginWithTokenRequest;
|
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.login.LoginUser;
|
||||||
import cn.stylefeng.roses.kernel.jwt.api.pojo.payload.DefaultJwtPayload;
|
import cn.stylefeng.roses.kernel.auth.api.pojo.payload.DefaultJwtPayload;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 认证服务的接口,包括基本的登录退出操作和校验token等操作
|
* 认证服务的接口,包括基本的登录退出操作和校验token等操作
|
||||||
|
|
|
@ -22,10 +22,10 @@
|
||||||
* 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns
|
* 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns
|
||||||
* 6.若您的项目无法满足以上几点,可申请商业授权
|
* 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.hutool.extra.spring.SpringUtil;
|
||||||
import cn.stylefeng.roses.kernel.jwt.api.JwtApi;
|
import cn.stylefeng.roses.kernel.auth.api.AuthJwtTokenApi;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Jwt工具的context,获取容器中的jwt工具类
|
* Jwt工具的context,获取容器中的jwt工具类
|
||||||
|
@ -33,7 +33,7 @@ import cn.stylefeng.roses.kernel.jwt.api.JwtApi;
|
||||||
* @author fengshuonan
|
* @author fengshuonan
|
||||||
* @since 2020/10/21 14:07
|
* @since 2020/10/21 14:07
|
||||||
*/
|
*/
|
||||||
public class JwtContext {
|
public class AuthJwtContext {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取jwt操作接口
|
* 获取jwt操作接口
|
||||||
|
@ -41,8 +41,8 @@ public class JwtContext {
|
||||||
* @author fengshuonan
|
* @author fengshuonan
|
||||||
* @since 2020/10/21 14:07
|
* @since 2020/10/21 14:07
|
||||||
*/
|
*/
|
||||||
public static JwtApi me() {
|
public static AuthJwtTokenApi me() {
|
||||||
return SpringUtil.getBean(JwtApi.class);
|
return SpringUtil.getBean(AuthJwtTokenApi.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -22,7 +22,7 @@
|
||||||
* 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns
|
* 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns
|
||||||
* 6.若您的项目无法满足以上几点,可申请商业授权
|
* 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.hutool.core.util.RandomUtil;
|
||||||
import cn.stylefeng.roses.kernel.config.api.context.ConfigContext;
|
import cn.stylefeng.roses.kernel.config.api.context.ConfigContext;
|
|
@ -22,7 +22,7 @@
|
||||||
* 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns
|
* 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns
|
||||||
* 6.若您的项目无法满足以上几点,可申请商业授权
|
* 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 cn.hutool.core.util.IdUtil;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
|
@ -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.TempSecretApi;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.constants.AuthConstants;
|
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.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.context.LoginContext;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.enums.SsoClientTypeEnum;
|
import cn.stylefeng.roses.kernel.auth.api.enums.SsoClientTypeEnum;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.exception.AuthException;
|
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.LoginResponse;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginWithTokenRequest;
|
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.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.SsoLoginCodeRequest;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.pojo.sso.SsoProperties;
|
import cn.stylefeng.roses.kernel.auth.api.pojo.sso.SsoProperties;
|
||||||
import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
|
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.constants.DatasourceContainerConstants;
|
||||||
import cn.stylefeng.roses.kernel.dsctn.api.context.CurrentDataSourceContext;
|
import cn.stylefeng.roses.kernel.dsctn.api.context.CurrentDataSourceContext;
|
||||||
import cn.stylefeng.roses.kernel.jwt.JwtTokenOperator;
|
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.JwtException;
|
||||||
import cn.stylefeng.roses.kernel.jwt.api.exception.enums.JwtExceptionEnum;
|
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.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.log.api.LoginLogServiceApi;
|
||||||
import cn.stylefeng.roses.kernel.message.api.expander.WebSocketConfigExpander;
|
import cn.stylefeng.roses.kernel.message.api.expander.WebSocketConfigExpander;
|
||||||
import cn.stylefeng.roses.kernel.rule.constants.RuleConstants;
|
import cn.stylefeng.roses.kernel.rule.constants.RuleConstants;
|
||||||
|
@ -130,6 +131,9 @@ public class AuthServiceImpl implements AuthServiceApi {
|
||||||
@Resource(name = "caClientTokenCacheApi")
|
@Resource(name = "caClientTokenCacheApi")
|
||||||
private CacheOperatorApi<String> caClientTokenCacheApi;
|
private CacheOperatorApi<String> caClientTokenCacheApi;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private JwtApi jwtApi;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LoginResponse login(LoginRequest loginRequest) {
|
public LoginResponse login(LoginRequest loginRequest) {
|
||||||
return loginAction(loginRequest, true, null);
|
return loginAction(loginRequest, true, null);
|
||||||
|
@ -225,10 +229,10 @@ public class AuthServiceImpl implements AuthServiceApi {
|
||||||
public DefaultJwtPayload validateToken(String token) throws AuthException {
|
public DefaultJwtPayload validateToken(String token) throws AuthException {
|
||||||
try {
|
try {
|
||||||
// 1. 先校验jwt token本身是否有问题
|
// 1. 先校验jwt token本身是否有问题
|
||||||
JwtContext.me().validateTokenWithException(token);
|
jwtApi.validateTokenWithException(token);
|
||||||
|
|
||||||
// 2. 获取jwt的payload
|
// 2. 获取jwt的payload
|
||||||
DefaultJwtPayload defaultPayload = JwtContext.me().getDefaultPayload(token);
|
DefaultJwtPayload defaultPayload = AuthJwtContext.me().getDefaultPayload(token);
|
||||||
|
|
||||||
// 3. 如果是7天免登陆,则不校验session过期
|
// 3. 如果是7天免登陆,则不校验session过期
|
||||||
if (defaultPayload.getRememberMe()) {
|
if (defaultPayload.getRememberMe()) {
|
||||||
|
@ -412,7 +416,7 @@ public class AuthServiceImpl implements AuthServiceApi {
|
||||||
|
|
||||||
// 9. 生成用户的token
|
// 9. 生成用户的token
|
||||||
DefaultJwtPayload defaultJwtPayload = new DefaultJwtPayload(loginUser.getUserId(), loginUser.getAccount(), loginRequest.getRememberMe(), caToken, loginRequest.getTenantCode());
|
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.setToken(jwtToken);
|
||||||
|
|
||||||
// 如果包含租户编码,则放到loginUser中
|
// 如果包含租户编码,则放到loginUser中
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auth模块对JWT 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auth模块对jwt的封装
|
||||||
|
*
|
||||||
|
* @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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -17,13 +17,6 @@
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|
||||||
<!--config模块的api-->
|
|
||||||
<dependency>
|
|
||||||
<groupId>cn.stylefeng.roses</groupId>
|
|
||||||
<artifactId>config-api</artifactId>
|
|
||||||
<version>${roses.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!--jwt token-->
|
<!--jwt token-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.jsonwebtoken</groupId>
|
<groupId>io.jsonwebtoken</groupId>
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
package cn.stylefeng.roses.kernel.jwt.api;
|
package cn.stylefeng.roses.kernel.jwt.api;
|
||||||
|
|
||||||
import cn.stylefeng.roses.kernel.jwt.api.exception.JwtException;
|
import cn.stylefeng.roses.kernel.jwt.api.exception.JwtException;
|
||||||
import cn.stylefeng.roses.kernel.jwt.api.pojo.payload.DefaultJwtPayload;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ -47,16 +46,6 @@ public interface JwtApi {
|
||||||
*/
|
*/
|
||||||
String generateToken(Map<String, Object> payload);
|
String generateToken(Map<String, Object> payload);
|
||||||
|
|
||||||
/**
|
|
||||||
* 生成token,用默认的payload格式
|
|
||||||
*
|
|
||||||
* @param defaultJwtPayload jwt的载体信息
|
|
||||||
* @return jwt token
|
|
||||||
* @author fengshuonan
|
|
||||||
* @since 2020/10/21 11:38
|
|
||||||
*/
|
|
||||||
String generateTokenDefaultPayload(DefaultJwtPayload defaultJwtPayload);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取jwt的payload(通用的)
|
* 获取jwt的payload(通用的)
|
||||||
*
|
*
|
||||||
|
@ -67,16 +56,6 @@ public interface JwtApi {
|
||||||
*/
|
*/
|
||||||
Map<String, Object> getJwtPayloadClaims(String token);
|
Map<String, Object> getJwtPayloadClaims(String token);
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取jwt的payload(限定默认格式)
|
|
||||||
*
|
|
||||||
* @param token jwt的token
|
|
||||||
* @return 返回默认格式的payload
|
|
||||||
* @author fengshuonan
|
|
||||||
* @since 2020/10/21 11:51
|
|
||||||
*/
|
|
||||||
DefaultJwtPayload getDefaultPayload(String token);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 校验jwt token是否正确
|
* 校验jwt token是否正确
|
||||||
* <p>
|
* <p>
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
*/
|
*/
|
||||||
package cn.stylefeng.roses.kernel.jwt;
|
package cn.stylefeng.roses.kernel.jwt;
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
|
||||||
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.convert.Convert;
|
||||||
import cn.hutool.core.date.DateTime;
|
import cn.hutool.core.date.DateTime;
|
||||||
import cn.hutool.core.date.DateUtil;
|
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.JwtException;
|
||||||
import cn.stylefeng.roses.kernel.jwt.api.exception.enums.JwtExceptionEnum;
|
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.config.JwtConfig;
|
||||||
import cn.stylefeng.roses.kernel.jwt.api.pojo.payload.DefaultJwtPayload;
|
|
||||||
import io.jsonwebtoken.Claims;
|
import io.jsonwebtoken.Claims;
|
||||||
import io.jsonwebtoken.ExpiredJwtException;
|
import io.jsonwebtoken.ExpiredJwtException;
|
||||||
import io.jsonwebtoken.Jwts;
|
import io.jsonwebtoken.Jwts;
|
||||||
|
@ -72,25 +70,6 @@ public class JwtTokenOperator implements JwtApi {
|
||||||
.compact();
|
.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
|
@Override
|
||||||
public Claims getJwtPayloadClaims(String token) {
|
public Claims getJwtPayloadClaims(String token) {
|
||||||
return Jwts.parser()
|
return Jwts.parser()
|
||||||
|
@ -99,12 +78,6 @@ public class JwtTokenOperator implements JwtApi {
|
||||||
.getBody();
|
.getBody();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public DefaultJwtPayload getDefaultPayload(String token) {
|
|
||||||
Map<String, Object> jwtPayload = getJwtPayloadClaims(token);
|
|
||||||
return BeanUtil.toBeanIgnoreError(jwtPayload, DefaultJwtPayload.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean validateToken(String token) {
|
public boolean validateToken(String token) {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
jwt功能的spring boot自动加载模块
|
|
|
@ -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>
|
|
|
@ -1,2 +0,0 @@
|
||||||
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
|
|
||||||
cn.stylefeng.roses.kernel.jwt.starter.GunsJwtAutoConfiguration
|
|
|
@ -18,7 +18,6 @@
|
||||||
<modules>
|
<modules>
|
||||||
<module>jwt-api</module>
|
<module>jwt-api</module>
|
||||||
<module>jwt-sdk</module>
|
<module>jwt-sdk</module>
|
||||||
<module>jwt-spring-boot-starter</module>
|
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
<!--jwt模块的sdk-->
|
<!--jwt模块的sdk-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.stylefeng.roses</groupId>
|
<groupId>cn.stylefeng.roses</groupId>
|
||||||
<artifactId>jwt-sdk</artifactId>
|
<artifactId>auth-api</artifactId>
|
||||||
<version>${roses.version}</version>
|
<version>${roses.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package cn.stylefeng.roses.kernel.socket.business.websocket.server;
|
package cn.stylefeng.roses.kernel.socket.business.websocket.server;
|
||||||
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.stylefeng.roses.kernel.jwt.api.context.JwtContext;
|
import cn.stylefeng.roses.kernel.auth.api.context.AuthJwtContext;
|
||||||
import cn.stylefeng.roses.kernel.jwt.api.pojo.payload.DefaultJwtPayload;
|
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.ClientMessageTypeEnum;
|
||||||
import cn.stylefeng.roses.kernel.socket.api.enums.ServerMessageTypeEnum;
|
import cn.stylefeng.roses.kernel.socket.api.enums.ServerMessageTypeEnum;
|
||||||
import cn.stylefeng.roses.kernel.socket.api.enums.SystemMessageTypeEnum;
|
import cn.stylefeng.roses.kernel.socket.api.enums.SystemMessageTypeEnum;
|
||||||
|
@ -46,7 +46,7 @@ public class WebSocketServer {
|
||||||
String userId = null;
|
String userId = null;
|
||||||
try {
|
try {
|
||||||
// 解析用户信息
|
// 解析用户信息
|
||||||
DefaultJwtPayload defaultPayload = JwtContext.me().getDefaultPayload(token);
|
DefaultJwtPayload defaultPayload = AuthJwtContext.me().getDefaultPayload(token);
|
||||||
userId = defaultPayload.getUserId().toString();
|
userId = defaultPayload.getUserId().toString();
|
||||||
} catch (io.jsonwebtoken.JwtException e) {
|
} catch (io.jsonwebtoken.JwtException e) {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -8,6 +8,7 @@ import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.core.util.RandomUtil;
|
import cn.hutool.core.util.RandomUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi;
|
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.context.LoginContext;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.exception.AuthException;
|
import cn.stylefeng.roses.kernel.auth.api.exception.AuthException;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.exception.enums.AuthExceptionEnum;
|
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.LoginRequest;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginResponse;
|
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.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.cache.api.CacheOperatorApi;
|
||||||
import cn.stylefeng.roses.kernel.customer.api.OldPasswordValidateApi;
|
import cn.stylefeng.roses.kernel.customer.api.OldPasswordValidateApi;
|
||||||
import cn.stylefeng.roses.kernel.customer.api.constants.CustomerConstants;
|
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.FileInfoApi;
|
||||||
import cn.stylefeng.roses.kernel.file.api.FileOperatorApi;
|
import cn.stylefeng.roses.kernel.file.api.FileOperatorApi;
|
||||||
import cn.stylefeng.roses.kernel.file.api.pojo.response.SysFileInfoResponse;
|
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.log.api.LoginLogServiceApi;
|
||||||
import cn.stylefeng.roses.kernel.rule.enums.StatusEnum;
|
import cn.stylefeng.roses.kernel.rule.enums.StatusEnum;
|
||||||
import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum;
|
import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum;
|
||||||
|
@ -202,7 +202,7 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
|
||||||
|
|
||||||
// 生成用户的token
|
// 生成用户的token
|
||||||
DefaultJwtPayload defaultJwtPayload = new DefaultJwtPayload(loginUser.getUserId(), loginUser.getAccount(), loginRequest.getRememberMe(), null, null);
|
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);
|
loginUser.setToken(jwtToken);
|
||||||
|
|
||||||
synchronized (SESSION_OPERATE_LOCK) {
|
synchronized (SESSION_OPERATE_LOCK) {
|
||||||
|
|
|
@ -31,6 +31,7 @@ import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi;
|
import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.constants.LoginCacheConstants;
|
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.context.LoginContext;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.enums.DataScopeTypeEnum;
|
import cn.stylefeng.roses.kernel.auth.api.enums.DataScopeTypeEnum;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.exception.enums.AuthExceptionEnum;
|
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.password.PasswordStoredEncryptApi;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
|
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.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.cache.api.CacheOperatorApi;
|
||||||
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
|
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
|
||||||
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
|
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.expand.modular.api.ExpandApi;
|
||||||
import cn.stylefeng.roses.kernel.file.api.FileInfoApi;
|
import cn.stylefeng.roses.kernel.file.api.FileInfoApi;
|
||||||
import cn.stylefeng.roses.kernel.file.api.constants.FileConstants;
|
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.message.api.expander.WebSocketConfigExpander;
|
||||||
import cn.stylefeng.roses.kernel.office.api.OfficeExcelApi;
|
import cn.stylefeng.roses.kernel.office.api.OfficeExcelApi;
|
||||||
import cn.stylefeng.roses.kernel.office.api.pojo.report.ExcelExportParam;
|
import cn.stylefeng.roses.kernel.office.api.pojo.report.ExcelExportParam;
|
||||||
|
@ -689,7 +689,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
||||||
|
|
||||||
// 生成用户的token
|
// 生成用户的token
|
||||||
DefaultJwtPayload defaultJwtPayload = new DefaultJwtPayload(loginUser.getUserId(), loginUser.getAccount(), false, null, null);
|
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);
|
loginUser.setToken(jwtToken);
|
||||||
|
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
|
|
Loading…
Reference in New Issue