Commit 3ab6e756 authored by shengnan hu's avatar shengnan hu
Browse files

init

parents
Pipeline #294 passed with stage
in 2 minutes and 13 seconds
<?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">
<parent>
<artifactId>mall4cloud-common</artifactId>
<groupId>com.mall4j.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall4cloud-common-rocketmq</artifactId>
<packaging>jar</packaging>
<description>mall4cloud rocketmq代码</description>
<dependencies>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>mall4cloud-common-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
package com.mall4j.cloud.common.rocketmq.config;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.apache.rocketmq.spring.support.RocketMQMessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* @author FrozenWatermelon
* @date 2021/3/30
*/
@RefreshScope
@Configuration
@Import({RocketMQAutoConfiguration.class})
public class RocketMqAdapter {
@Autowired
private RocketMQMessageConverter rocketMqMessageConverter;
@Value("${rocketmq.name-server:}")
private String nameServer;
public RocketMQTemplate getTemplateByTopicName(String topic){
RocketMQTemplate mqTemplate = new RocketMQTemplate();
DefaultMQProducer producer = new DefaultMQProducer(topic);
producer.setNamesrvAddr(nameServer);
producer.setRetryTimesWhenSendFailed(2);
producer.setSendMsgTimeout((int) RocketMqConstant.TIMEOUT);
mqTemplate.setProducer(producer);
mqTemplate.setMessageConverter(rocketMqMessageConverter.getMessageConverter());
return mqTemplate;
}
}
package com.mall4j.cloud.common.rocketmq.config;
/**
* nameserver用;分割
* 同步消息,如果两次
* @author FrozenWatermelon
* @date 2021/3/25
*/
public class RocketMqConstant {
// 延迟消息 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h (1-18)
/**
* 取消订单时间,实际上30分钟
*/
public static final int CANCEL_ORDER_DELAY_LEVEL = 16;
/**
* 默认发送消息超时时间
*/
public static final long TIMEOUT = 3000;
/**
* 库存解锁topic
*/
public static final String STOCK_UNLOCK_TOPIC = "stock-unlock-topic";
/**
* 订单取消
*/
public static final String ORDER_CANCEL_TOPIC = "order-cancel-topic";
/**
* 订单支付成功
*/
public static final String ORDER_NOTIFY_TOPIC = "order-notify-topic";
/**
* 订单支付成功 通知库存服务
*/
public static final String ORDER_NOTIFY_STOCK_TOPIC = "order-notify-stock-topic";
/**
* 商品搜索topic
*/
public static final String CANAL_TOPIC = "canal-topic";
}
<?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">
<parent>
<artifactId>mall4cloud-common</artifactId>
<groupId>com.mall4j.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall4cloud-common-security</artifactId>
<packaging>jar</packaging>
<description>mall4cloud 安全相关代码</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>mall4cloud-api-auth</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>mall4cloud-api-rbac</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>mall4cloud-common-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>mall4cloud-common-cache</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
</dependency>
</dependencies>
</project>
package com.mall4j.cloud.common.security;
import com.mall4j.cloud.api.auth.bo.UserInfoInTokenBO;
/**
* @author FrozenWatermelon
* @date 2020/7/16
*/
public class AuthUserContext {
/** The request holder. */
private static final ThreadLocal<UserInfoInTokenBO> USER_INFO_IN_TOKEN_HOLDER = new ThreadLocal<>();
public static UserInfoInTokenBO get() {
return USER_INFO_IN_TOKEN_HOLDER.get();
}
public static UserInfoInTokenBO forceGet() {
return USER_INFO_IN_TOKEN_HOLDER.get();
}
public static void set(UserInfoInTokenBO userInfoInTokenBo) {
USER_INFO_IN_TOKEN_HOLDER.set(userInfoInTokenBo);
}
public static void clean() {
if (USER_INFO_IN_TOKEN_HOLDER.get() != null) {
USER_INFO_IN_TOKEN_HOLDER.remove();
}
}
}
package com.mall4j.cloud.common.security.adapter;
import java.util.List;
/**
* 实现该接口之后,修改需要授权登陆的路径,不需要授权登陆的路径
*
* @author FrozenWatermelon
* @date 2020/7/4
*/
public interface AuthConfigAdapter {
/**
* 需要授权登陆的路径
* @return 需要授权登陆的路径列表
*/
List<String> pathPatterns();
/**
* 不需要授权登陆的路径
* @param paths
* @return 不需要授权登陆的路径列表
*/
List<String> excludePathPatterns(String... paths);
}
package com.mall4j.cloud.common.security.adapter;
import com.mall4j.cloud.common.feign.FeignInsideAuthConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* @author FrozenWatermelon
* @date 2020/7/16
*/
public class DefaultAuthConfigAdapter implements AuthConfigAdapter {
private static final Logger logger = LoggerFactory.getLogger(DefaultAuthConfigAdapter.class);
public DefaultAuthConfigAdapter() {
logger.info("not implement other AuthConfigAdapter, use DefaultAuthConfigAdapter... all url need auth...");
}
/**
* 内部直接调用接口,无需登录权限
*/
private static final String FEIGN_INSIDER_URI = FeignInsideAuthConfig.FEIGN_INSIDE_URL_PREFIX + "/insider/**";
/**
* 外部直接调用接口,无需登录权限 unwanted auth
*/
private static final String EXTERNAL_URI = "/**/ua/**";
/**
* swagger
*/
private static final String DOC_URI = "/v3/api-docs/default";
@Override
public List<String> pathPatterns() {
return Collections.singletonList("/*");
}
@Override
public List<String> excludePathPatterns(String... paths) {
List<String> arrayList = new ArrayList<>();
arrayList.add(DOC_URI);
arrayList.add(FEIGN_INSIDER_URI);
arrayList.add(EXTERNAL_URI);
arrayList.addAll(Arrays.asList(paths));
return arrayList;
}
}
package com.mall4j.cloud.common.security.bo;
import com.mall4j.cloud.api.auth.bo.UserInfoInTokenBO;
/**
* 用于校验的用户信息
*
* @author FrozenWatermelon
* @date 2020/7/3
*/
public class AuthAccountInVerifyBO extends UserInfoInTokenBO {
private String password;
private Integer status;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
@Override
public String toString() {
return "AuthAccountInVerifyBO{" +
"password='" + password + '\'' +
", status=" + status +
"} " + super.toString();
}
}
package com.mall4j.cloud.common.security.bo;
import com.mall4j.cloud.api.auth.bo.UserInfoInTokenBO;
/**
* token信息,该信息存在redis中
*
* @author FrozenWatermelon
* @date 2020/7/2
*/
public class TokenInfoBO {
/**
* 保存在token信息里面的用户信息
*/
private UserInfoInTokenBO userInfoInToken;
private String accessToken;
private String refreshToken;
/**
* 在多少秒后过期
*/
private Integer expiresIn;
public UserInfoInTokenBO getUserInfoInToken() {
return userInfoInToken;
}
public void setUserInfoInToken(UserInfoInTokenBO userInfoInToken) {
this.userInfoInToken = userInfoInToken;
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public String getRefreshToken() {
return refreshToken;
}
public void setRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
}
public Integer getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(Integer expiresIn) {
this.expiresIn = expiresIn;
}
@Override
public String toString() {
return "TokenInfoBO{" + "userInfoInToken=" + userInfoInToken + ", accessToken='" + accessToken + '\''
+ ", refreshToken='" + refreshToken + '\'' + ", expiresIn=" + expiresIn + '}';
}
}
package com.mall4j.cloud.common.security.config;
import cn.hutool.core.util.ArrayUtil;
import com.mall4j.cloud.common.security.adapter.AuthConfigAdapter;
import com.mall4j.cloud.common.security.adapter.DefaultAuthConfigAdapter;
import com.mall4j.cloud.common.security.filter.AuthFilter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import jakarta.servlet.DispatcherType;
/**
* 授权配置
*
* @author FrozenWatermelon
* @date 2020/7/11
*/
@Configuration
public class AuthConfig {
@Bean
@ConditionalOnMissingBean
public AuthConfigAdapter authConfigAdapter() {
return new DefaultAuthConfigAdapter();
}
@Bean
@Lazy
public FilterRegistrationBean<AuthFilter> filterRegistration(AuthConfigAdapter authConfigAdapter, AuthFilter authFilter) {
FilterRegistrationBean<AuthFilter> registration = new FilterRegistrationBean<>();
// 添加过滤器
registration.setFilter(authFilter);
// 设置过滤路径,/*所有路径
registration.addUrlPatterns(ArrayUtil.toArray(authConfigAdapter.pathPatterns(), String.class));
registration.setName("authFilter");
// 设置优先级
registration.setOrder(0);
registration.setDispatcherTypes(DispatcherType.REQUEST);
return registration;
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment