完成 oauth2.0 的逻辑

This commit is contained in:
YunaiV 2020-07-04 09:42:24 +08:00
parent dfd1360b28
commit 20d8db6ce8
85 changed files with 516 additions and 362 deletions

View File

@ -1,4 +1,4 @@
package cn.iocoder.common.framework.constant;
package cn.iocoder.common.framework.enums;
import cn.iocoder.common.framework.core.IntArrayValuable;
@ -17,11 +17,11 @@ public enum CommonStatusEnum implements IntArrayValuable {
/**
* 状态值
*/
private Integer value;
private final Integer value;
/**
* 状态名
*/
private String name;
private final String name;
CommonStatusEnum(Integer value, String name) {
this.value = value;
@ -32,29 +32,10 @@ public enum CommonStatusEnum implements IntArrayValuable {
return value;
}
public CommonStatusEnum setValue(Integer value) {
this.value = value;
return this;
}
public String getName() {
return name;
}
public CommonStatusEnum setName(String name) {
this.name = name;
return this;
}
@Deprecated
public static boolean isValid(Integer status) {
if (status == null) {
return false;
}
return ENABLE.value.equals(status)
|| DISABLE.value.equals(status);
}
@Override
public int[] array() {
return ARRAYS;

View File

@ -1,4 +1,4 @@
package cn.iocoder.common.framework.constant;
package cn.iocoder.common.framework.enums;
/**
* Mall 全局枚举

View File

@ -1,4 +1,4 @@
package cn.iocoder.common.framework.constant;
package cn.iocoder.common.framework.enums;
/**
* 模块错误码区间

View File

@ -1,4 +1,4 @@
package cn.iocoder.common.framework.constant;
package cn.iocoder.common.framework.enums;
/**
* 错误码枚举类

View File

@ -1,4 +1,4 @@
package cn.iocoder.common.framework.constant;
package cn.iocoder.common.framework.enums;
import cn.iocoder.common.framework.core.IntArrayValuable;
@ -17,11 +17,11 @@ public enum UserTypeEnum implements IntArrayValuable {
/**
* 类型
*/
private Integer value;
private final Integer value;
/**
* 类型名
*/
private String name;
private final String name;
UserTypeEnum(Integer value, String name) {
this.value = value;
@ -32,20 +32,10 @@ public enum UserTypeEnum implements IntArrayValuable {
return value;
}
public UserTypeEnum setValue(Integer value) {
this.value = value;
return this;
}
public String getName() {
return name;
}
public UserTypeEnum setName(String name) {
this.name = name;
return this;
}
@Override
public int[] array() {
return ARRAYS;

View File

@ -1,6 +1,6 @@
package cn.iocoder.common.framework.util;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.enums.MallConstants;
import cn.iocoder.common.framework.vo.CommonResult;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.web.core.handler;
import cn.iocoder.common.framework.constant.SysErrorCodeEnum;
import cn.iocoder.common.framework.enums.SysErrorCodeEnum;
import cn.iocoder.common.framework.exception.ServiceException;
import cn.iocoder.common.framework.util.ExceptionUtil;
import cn.iocoder.common.framework.util.HttpUtil;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.demo.business.service;
import cn.iocoder.common.framework.constant.DeletedStatusEnum;
import cn.iocoder.common.framework.enums.DeletedStatusEnum;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.mall.demo.business.api.DemoOrderService;
import cn.iocoder.mall.demo.business.api.DemoProductService;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.order.biz.enums.order;
import cn.iocoder.common.framework.constant.ModuleErrorCodeInterval;
import cn.iocoder.common.framework.enums.ModuleErrorCodeInterval;
/**
* 错误码区间

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.order.rest.controller.comment;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.enums.MallConstants;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.order.rest.controller.comment;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.enums.MallConstants;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.order.biz.dto.comment.OrderCommentPageDTO;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.order.api.constant;
import cn.iocoder.common.framework.constant.ModuleErrorCodeInterval;
import cn.iocoder.common.framework.enums.ModuleErrorCodeInterval;
/**
* 错误码区间

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.order.biz.service;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.mall.order.api.CartService;
import cn.iocoder.mall.order.api.bo.CalcOrderPriceBO;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.order.biz.service;
import cn.iocoder.common.framework.constant.DeletedStatusEnum;
import cn.iocoder.common.framework.enums.DeletedStatusEnum;
import cn.iocoder.common.framework.util.DateUtil;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.vo.CommonResult;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.order.biz.service;
import cn.iocoder.common.framework.constant.DeletedStatusEnum;
import cn.iocoder.common.framework.enums.DeletedStatusEnum;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.system.api.DataDictService;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.order.biz.service;
import cn.iocoder.common.framework.constant.DeletedStatusEnum;
import cn.iocoder.common.framework.enums.DeletedStatusEnum;
import cn.iocoder.common.framework.util.DateUtil;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.vo.CommonResult;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.pay.biz.service;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.mall.pay.api.constant.PayErrorCodeEnum;
import cn.iocoder.mall.pay.biz.dao.PayAppMapper;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.product.biz.service.attr;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.validator.InEnum;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.product.biz.bo.attr.ProductAttrBO;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.product.rest.controller.category;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.enums.MallConstants;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.product.biz.bo.category.ProductCategoryBO;
import cn.iocoder.mall.product.biz.dto.category.ProductCategoryAddDTO;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.product.api;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.validator.InEnum;
import cn.iocoder.mall.product.api.bo.ProductAttrBO;
import cn.iocoder.mall.product.api.bo.ProductAttrPageBO;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.product.api;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.validator.InEnum;
import cn.iocoder.mall.product.api.bo.ProductCategoryBO;
import cn.iocoder.mall.product.api.dto.ProductCategoryAddDTO;

View File

@ -34,7 +34,7 @@ public class BannerDO extends DeletableDO {
/**
* 状态
*
* {@link cn.iocoder.common.framework.constant.CommonStatusEnum}
* {@link cn.iocoder.common.framework.enums.CommonStatusEnum}
*/
private Integer status;
/**

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.promotion.biz.service.banner;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.validator.InEnum;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.promotion.biz.bo.banner.BannerListBO;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.promotion.biz.service.banner;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.mybatis.enums.DeletedStatusEnum;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.promotion.api;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.validator.InEnum;
import cn.iocoder.mall.promotion.api.bo.BannerBO;
import cn.iocoder.mall.promotion.api.bo.BannerPageBO;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.promotion.api;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.exception.ServiceException;
import cn.iocoder.common.framework.validator.InEnum;
import cn.iocoder.mall.promotion.api.bo.ProductRecommendBO;

View File

@ -35,7 +35,7 @@ public class ProductRecommendBO implements Serializable {
/**
* 状态
*
* {@link cn.iocoder.common.framework.constant.CommonStatusEnum}
* {@link cn.iocoder.common.framework.enums.CommonStatusEnum}
*/
private Integer status;
/**

View File

@ -34,7 +34,7 @@ public class BannerDO extends DeletableDO {
/**
* 状态
*
* {@link cn.iocoder.common.framework.constant.CommonStatusEnum}
* {@link cn.iocoder.common.framework.enums.CommonStatusEnum}
*/
private Integer status;
/**

View File

@ -35,7 +35,7 @@ public class ProductRecommendDO extends DeletableDO {
/**
* 状态
*
* {@link cn.iocoder.common.framework.constant.CommonStatusEnum}
* {@link cn.iocoder.common.framework.enums.CommonStatusEnum}
*/
private Integer status;
/**

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.promotion.biz.service;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.mall.mybatis.enums.DeletedStatusEnum;
import cn.iocoder.mall.promotion.api.BannerService;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.promotion.biz.service;
import cn.iocoder.common.framework.constant.SysErrorCodeEnum;
import cn.iocoder.common.framework.enums.SysErrorCodeEnum;
import cn.iocoder.common.framework.util.DateUtil;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.util.StringUtil;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.promotion.biz.service;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.mall.mybatis.enums.DeletedStatusEnum;
import cn.iocoder.mall.product.rpc.api.ProductSpuRpc;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.promotion.application.controller.users;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.promotion.api.BannerService;
import cn.iocoder.mall.promotion.api.bo.BannerBO;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.promotion.application.controller.users;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.product.api.ProductSpuService;
import cn.iocoder.mall.product.api.bo.ProductSpuBO;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.search.rest.controller.user;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.enums.MallConstants;
import cn.iocoder.common.framework.util.StringUtil;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.SortingField;

View File

@ -1,4 +1,16 @@
package cn.iocoder.mall.systemservice.rpc.oauth;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.systemservice.rpc.oauth.dto.OAuth2CreateAccessTokenDTO;
import cn.iocoder.mall.systemservice.rpc.oauth.dto.OAuth2RefreshAccessTokenDTO;
import cn.iocoder.mall.systemservice.rpc.oauth.vo.OAuth2AccessTokenVO;
public interface OAuth2Rpc {
CommonResult<OAuth2AccessTokenVO> createAccessToken(OAuth2CreateAccessTokenDTO createAccessTokenDTO);
CommonResult<OAuth2AccessTokenVO> checkAccessToken(String accessToken);
CommonResult<OAuth2AccessTokenVO> refreshAccessToken(OAuth2RefreshAccessTokenDTO refreshAccessTokenDTO);
}

View File

@ -0,0 +1,28 @@
package cn.iocoder.mall.systemservice.rpc.oauth.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* OAuth2.0 访问令牌创建 DTO
*/
@Data
@Accessors(chain = true)
public class OAuth2CreateAccessTokenDTO implements Serializable {
/**
* 用户编号
*/
private Integer userId;
/**
* 用户类型
*/
private Integer userType;
/**
* 创建 IP
*/
private String createIp;
}

View File

@ -0,0 +1,24 @@
package cn.iocoder.mall.systemservice.rpc.oauth.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* OAuth2.0 访问令牌创建 DTO
*/
@Data
@Accessors(chain = true)
public class OAuth2RefreshAccessTokenDTO implements Serializable {
/**
* 刷新令牌
*/
private String refreshToken;
/**
* 创建 IP
*/
private String createIp;
}

View File

@ -0,0 +1,38 @@
package cn.iocoder.mall.systemservice.rpc.oauth.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* OAuth2.0 访问令牌 VO
*/
@Data
@Accessors(chain = true)
public class OAuth2AccessTokenVO implements Serializable {
/**
* 访问令牌
*/
private String accessToken;
/**
* 刷新令牌
*/
private String refreshToken;
/**
* 用户编号
*/
private Integer userId;
/**
* 用户类型
*/
private Integer userType;
/**
* 过期时间
*/
private Date expiresTime;
}

View File

@ -0,0 +1,20 @@
package cn.iocoder.mall.systemservice.convert.oauth;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.oauth.OAuth2AccessTokenDO;
import cn.iocoder.mall.systemservice.rpc.oauth.vo.OAuth2AccessTokenVO;
import cn.iocoder.mall.systemservice.service.oauth.bo.OAuth2AccessTokenBO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface OAuth2Convert {
OAuth2Convert INSTANCE = Mappers.getMapper(OAuth2Convert.class);
@Mapping(source = "id", target = "accessToken")
OAuth2AccessTokenBO convert(OAuth2AccessTokenDO bean);
OAuth2AccessTokenVO convert(OAuth2AccessTokenBO bean);
}

View File

@ -0,0 +1 @@
package cn.iocoder.mall.systemservice.convert;

View File

@ -1,7 +1,7 @@
package cn.iocoder.mall.system.biz.dataobject.oauth2;
package cn.iocoder.mall.systemservice.dal.mysql.dataobject.oauth;
import cn.iocoder.common.framework.enums.UserTypeEnum;
import cn.iocoder.mall.mybatis.dataobject.BaseDO;
import cn.iocoder.mall.system.biz.dataobject.account.AccountDO;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@ -13,6 +13,9 @@ import java.util.Date;
/**
* OAuth2 访问令牌
*
* idx_userId 索引对应 {@link #userId} 字段
* idx_refreshToken 索引对应 {@link #refreshToken} 字段
*/
@TableName("oauth2_access_token")
@Data
@ -25,25 +28,29 @@ public class OAuth2AccessTokenDO extends BaseDO {
*/
@TableId(type = IdType.INPUT)
private String id;
/**
* 用户编号
*/
private Integer userId;
/**
* 用户类型
*
* 枚举 {@link UserTypeEnum}
*/
private Integer userType;
/**
* 刷新令牌
*
* 关联 {@link OAuth2RefreshTokenDO#getId()}
*/
private String refreshToken;
/**
* 账号编号
*
* 关联 {@link AccountDO#getId()}
*/
private Integer accountId;
/**
* 过期时间
*/
private Date expiresTime;
/**
* 是否有效
* 创建 IP
*/
private Boolean valid;
private String createIp;
}

View File

@ -1,7 +1,7 @@
package cn.iocoder.mall.system.biz.dataobject.oauth2;
package cn.iocoder.mall.systemservice.dal.mysql.dataobject.oauth;
import cn.iocoder.mall.mybatis.dataobject.BaseDO;
import cn.iocoder.mall.system.biz.dataobject.account.AccountDO;
import cn.iocoder.common.framework.enums.UserTypeEnum;
import cn.iocoder.mall.mybatis.dataobject.DeletableDO;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@ -14,13 +14,13 @@ import java.util.Date;
/**
* OAuth2 刷新令牌
*
* idx_uid
* idx_userId 索引对应 {@link #userId} 字段
*/
@TableName("oauth2_refresh_token")
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class OAuth2RefreshTokenDO extends BaseDO {
public class OAuth2RefreshTokenDO extends DeletableDO {
/**
* 刷新令牌
@ -28,18 +28,22 @@ public class OAuth2RefreshTokenDO extends BaseDO {
@TableId(type = IdType.INPUT)
private String id;
/**
* 账号编号
*
* 关联 {@link AccountDO#getId()}
* 用户编号
*/
private Integer accountId;
private Integer userId;
/**
* 是否有效
* 用户类型
*
* 枚举 {@link UserTypeEnum}
*/
private Boolean valid;
private Integer userType;
/**
* 过期时间
*/
private Date expiresTime;
/**
* 创建 IP
*/
private String createIp;
}

View File

@ -0,0 +1 @@
package cn.iocoder.mall.systemservice.dal.mysql.dataobject;

View File

@ -0,0 +1,20 @@
package cn.iocoder.mall.systemservice.dal.mysql.mapper.oauth;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.oauth.OAuth2AccessTokenDO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
@Repository
public interface OAuth2AccessTokenMapper extends BaseMapper<OAuth2AccessTokenDO> {
default int deleteByUserIdAndUserType(Integer userId, Integer userType) {
return delete(new QueryWrapper<OAuth2AccessTokenDO>()
.eq("user_id", userId).eq("user_type", userType));
}
default int deleteByRefreshToken(String refreshToken) {
return delete(new QueryWrapper<OAuth2AccessTokenDO>().eq("refresh_token", refreshToken));
}
}

View File

@ -0,0 +1,16 @@
package cn.iocoder.mall.systemservice.dal.mysql.mapper.oauth;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.oauth.OAuth2RefreshTokenDO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
@Repository
public interface OAuth2RefreshTokenMapper extends BaseMapper<OAuth2RefreshTokenDO> {
default int deleteByUserIdAndUserType(Integer userId, Integer userType) {
return delete(new QueryWrapper<OAuth2RefreshTokenDO>()
.eq("user_id", userId).eq("user_type", userType));
}
}

View File

@ -0,0 +1 @@
package cn.iocoder.mall.systemservice.dal.mysql.mapper;

View File

@ -0,0 +1,38 @@
package cn.iocoder.mall.systemservice.manager.oauth;
import cn.iocoder.mall.systemservice.convert.oauth.OAuth2Convert;
import cn.iocoder.mall.systemservice.rpc.oauth.dto.OAuth2CreateAccessTokenDTO;
import cn.iocoder.mall.systemservice.rpc.oauth.dto.OAuth2RefreshAccessTokenDTO;
import cn.iocoder.mall.systemservice.rpc.oauth.vo.OAuth2AccessTokenVO;
import cn.iocoder.mall.systemservice.service.oauth.OAuth2Service;
import cn.iocoder.mall.systemservice.service.oauth.bo.OAuth2AccessTokenBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* OAuth2.0 Manager
*/
@Service
public class OAuth2Manager {
@Autowired
private OAuth2Service oauth2Service;
public OAuth2AccessTokenVO createAccessToken(OAuth2CreateAccessTokenDTO createAccessTokenDTO) {
OAuth2AccessTokenBO accessTokenBO = oauth2Service.createAccessToken(createAccessTokenDTO.getUserId(),
createAccessTokenDTO.getUserType(), createAccessTokenDTO.getCreateIp());
return OAuth2Convert.INSTANCE.convert(accessTokenBO);
}
public OAuth2AccessTokenVO checkAccessToken(String accessToken) {
OAuth2AccessTokenBO accessTokenBO = oauth2Service.checkAccessToken(accessToken);
return OAuth2Convert.INSTANCE.convert(accessTokenBO);
}
public OAuth2AccessTokenVO refreshAccessToken(OAuth2RefreshAccessTokenDTO refreshAccessTokenDTO) {
OAuth2AccessTokenBO accessTokenBO = oauth2Service.refreshAccessToken(refreshAccessTokenDTO.getRefreshToken(),
refreshAccessTokenDTO.getCreateIp());
return OAuth2Convert.INSTANCE.convert(accessTokenBO);
}
}

View File

@ -0,0 +1 @@
package cn.iocoder.mall.systemservice.manager;

View File

@ -1,7 +1,34 @@
package cn.iocoder.mall.systemservice.rpc.oauth;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.systemservice.manager.oauth.OAuth2Manager;
import cn.iocoder.mall.systemservice.rpc.oauth.dto.OAuth2CreateAccessTokenDTO;
import cn.iocoder.mall.systemservice.rpc.oauth.dto.OAuth2RefreshAccessTokenDTO;
import cn.iocoder.mall.systemservice.rpc.oauth.vo.OAuth2AccessTokenVO;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import static cn.iocoder.common.framework.vo.CommonResult.success;
@Service(version = "${dubbo.provider.OAuth2Rpc.version}", validation = "false")
public class OAuth2RpcImpl implements OAuth2Rpc {
@Autowired
private OAuth2Manager oauth2Manager;
@Override
public CommonResult<OAuth2AccessTokenVO> createAccessToken(OAuth2CreateAccessTokenDTO createAccessTokenDTO) {
return success(oauth2Manager.createAccessToken(createAccessTokenDTO));
}
@Override
public CommonResult<OAuth2AccessTokenVO> checkAccessToken(String accessToken) {
return success(oauth2Manager.checkAccessToken(accessToken));
}
@Override
public CommonResult<OAuth2AccessTokenVO> refreshAccessToken(OAuth2RefreshAccessTokenDTO refreshAccessTokenDTO) {
return success(oauth2Manager.refreshAccessToken(refreshAccessTokenDTO));
}
}

View File

@ -0,0 +1,112 @@
package cn.iocoder.mall.systemservice.service.oauth;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.util.StringUtils;
import cn.iocoder.mall.systemservice.convert.oauth.OAuth2Convert;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.oauth.OAuth2AccessTokenDO;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.oauth.OAuth2RefreshTokenDO;
import cn.iocoder.mall.systemservice.dal.mysql.mapper.oauth.OAuth2AccessTokenMapper;
import cn.iocoder.mall.systemservice.dal.mysql.mapper.oauth.OAuth2RefreshTokenMapper;
import cn.iocoder.mall.systemservice.service.oauth.bo.OAuth2AccessTokenBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import static cn.iocoder.mall.systemservice.enums.SystemErrorCodeEnum.*;
/**
* OAuth2.0 Service
*/
@Service
public class OAuth2Service {
/**
* 访问令牌过期时间单位毫秒
*/
@Value("${modules.oauth2-service.access-token-expire-time-millis}")
private int accessTokenExpireTimeMillis;
/**
* 刷新令牌过期时间单位毫秒
*/
@Value("${modules.oauth2-service.refresh-token-expire-time-millis}")
private int refreshTokenExpireTimeMillis;
@Autowired
private OAuth2AccessTokenMapper oauth2AccessTokenMapper;
@Autowired
private OAuth2RefreshTokenMapper oauth2RefreshTokenMapper;
@Transactional
public OAuth2AccessTokenBO createAccessToken(Integer userId, Integer userType, String createIp) {
// 创建刷新令牌 + 访问令牌
OAuth2RefreshTokenDO refreshTokenDO = createOAuth2RefreshToken(userId, userType, createIp);
OAuth2AccessTokenDO accessTokenDO = createOAuth2AccessToken(refreshTokenDO, createIp);
// 返回访问令牌
return OAuth2Convert.INSTANCE.convert(accessTokenDO);
}
@Transactional
public OAuth2AccessTokenBO checkAccessToken(String accessToken) {
OAuth2AccessTokenDO accessTokenDO = oauth2AccessTokenMapper.selectById(accessToken);
if (accessTokenDO == null) { // 不存在
throw ServiceExceptionUtil.exception(OAUTH2_ACCESS_TOKEN_NOT_FOUND);
}
if (accessTokenDO.getExpiresTime().getTime() < System.currentTimeMillis()) { // 已过期
throw ServiceExceptionUtil.exception(OAUTH2_ACCESS_TOKEN_TOKEN_EXPIRED);
}
// 返回访问令牌
return OAuth2Convert.INSTANCE.convert(accessTokenDO);
}
@Transactional
public OAuth2AccessTokenBO refreshAccessToken(String refreshToken, String createIp) {
OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectById(refreshToken);
// 校验刷新令牌是否合法
if (refreshTokenDO == null) { // 不存在
throw ServiceExceptionUtil.exception(OAUTH2_REFRESH_TOKEN_NOT_FOUND);
}
if (refreshTokenDO.getExpiresTime().getTime() < System.currentTimeMillis()) { // 已过期
throw ServiceExceptionUtil.exception(OAUTH_REFRESH_TOKEN_EXPIRED);
}
// 标记 refreshToken 对应的 accessToken 都不合法
// 这块的实现参考了 Spring Security OAuth2 的代码
oauth2AccessTokenMapper.deleteByRefreshToken(refreshToken);
// 创建访问令牌
OAuth2AccessTokenDO oauth2AccessTokenDO = createOAuth2AccessToken(refreshTokenDO, createIp);
// 返回访问令牌
return OAuth2Convert.INSTANCE.convert(oauth2AccessTokenDO);
}
private OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2RefreshTokenDO refreshTokenDO, String createIp) {
OAuth2AccessTokenDO accessToken = new OAuth2AccessTokenDO()
.setId(generateAccessToken())
.setUserId(refreshTokenDO.getUserId()).setUserType(refreshTokenDO.getUserType())
.setRefreshToken(refreshTokenDO.getId())
.setExpiresTime(new Date(System.currentTimeMillis() + accessTokenExpireTimeMillis))
.setCreateIp(createIp);
oauth2AccessTokenMapper.insert(accessToken);
return accessToken;
}
private OAuth2RefreshTokenDO createOAuth2RefreshToken(Integer userId, Integer userType, String createIp) {
OAuth2RefreshTokenDO refreshToken = new OAuth2RefreshTokenDO()
.setId(generateRefreshToken())
.setUserId(userId).setUserType(userType)
.setExpiresTime(new Date(System.currentTimeMillis() + refreshTokenExpireTimeMillis))
.setCreateIp(createIp);
oauth2RefreshTokenMapper.insert(refreshToken);
return refreshToken;
}
private String generateAccessToken() {
return StringUtils.uuid(true);
}
private String generateRefreshToken() {
return StringUtils.uuid(true);
}
}

View File

@ -0,0 +1,36 @@
package cn.iocoder.mall.systemservice.service.oauth.bo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* OAuth2.0 访问令牌 BO
*/
@Data
@Accessors(chain = true)
public class OAuth2AccessTokenBO {
/**
* 访问令牌
*/
private String accessToken;
/**
* 刷新令牌
*/
private String refreshToken;
/**
* 用户编号
*/
private Integer userId;
/**
* 用户类型
*/
private Integer userType;
/**
* 过期时间
*/
private Date expiresTime;
}

View File

@ -0,0 +1 @@
package cn.iocoder.mall.systemservice.service;

View File

@ -0,0 +1,4 @@
##################### 业务模块 #####################
## OAuth2CodeService
modules.oauth2-service.access-token-expire-time-millis = 2880000
modules.oauth2-service.refresh-token-expire-time-millis = 43200000

View File

@ -1,24 +0,0 @@
package cn.iocoder.mall.system.biz.dao.oauth2;
import cn.iocoder.mall.system.biz.dataobject.oauth2.OAuth2AccessTokenDO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
@Repository
public interface OAuth2AccessTokenMapper extends BaseMapper<OAuth2AccessTokenDO> {
default int updateToInvalid(Integer accountId) {
QueryWrapper<OAuth2AccessTokenDO> query = new QueryWrapper<OAuth2AccessTokenDO>()
.eq("account_id", accountId)
.eq("valid", true);
return update(new OAuth2AccessTokenDO().setValid(false), query);
}
default int updateToInvalidByRefreshToken(String refreshToken) {
QueryWrapper<OAuth2AccessTokenDO> query = new QueryWrapper<OAuth2AccessTokenDO>()
.eq("refresh_token", refreshToken).eq("valid", true);
return update(new OAuth2AccessTokenDO().setValid(false), query);
}
}

View File

@ -1,18 +0,0 @@
package cn.iocoder.mall.system.biz.dao.oauth2;
import cn.iocoder.mall.system.biz.dataobject.oauth2.OAuth2RefreshTokenDO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
@Repository
public interface OAuth2RefreshTokenMapper extends BaseMapper<OAuth2RefreshTokenDO> {
default int updateToInvalid(Integer accountId) {
QueryWrapper<OAuth2RefreshTokenDO> query = new QueryWrapper<OAuth2RefreshTokenDO>()
.eq("account_id", accountId)
.eq("valid", true);
return update(new OAuth2RefreshTokenDO().setValid(false), query);
}
}

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.system.biz.dataobject.account;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.mall.mybatis.dataobject.DeletableDO;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

View File

@ -1,12 +1,11 @@
package cn.iocoder.mall.system.biz.service.account;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.mall.system.biz.bo.account.AccountBO;
import cn.iocoder.mall.system.biz.convert.account.AccountConvert;
import cn.iocoder.mall.system.biz.dao.account.AccountMapper;
import cn.iocoder.mall.system.biz.dataobject.account.AccountDO;
import cn.iocoder.mall.system.biz.dto.account.AccountCreateDTO;
import cn.iocoder.mall.system.biz.service.account.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

View File

@ -1,22 +0,0 @@
package cn.iocoder.mall.system.biz.service.oauth2;
import cn.iocoder.mall.system.biz.bo.ouath2.OAuth2AuthenticateBO;
import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2AccessTokenAuthenticateDTO;
import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2MobileCodeAuthenticateDTO;
import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2RefreshTokenAuthenticateDTO;
import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2UsernameAuthenticateDTO;
/**
* OAuth2 Service 接口
*/
public interface OAuth2Service {
OAuth2AuthenticateBO authenticate(OAuth2UsernameAuthenticateDTO authenticateDTO);
OAuth2AuthenticateBO authenticate(OAuth2MobileCodeAuthenticateDTO authenticateDTO);
OAuth2AuthenticateBO authenticate(OAuth2AccessTokenAuthenticateDTO authenticateDTO);
OAuth2AuthenticateBO authenticate(OAuth2RefreshTokenAuthenticateDTO authenticateDTO);
}

View File

@ -1,168 +0,0 @@
package cn.iocoder.mall.system.biz.service.oauth2;
import cn.iocoder.common.framework.constant.SysErrorCodeEnum;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.util.ValidationUtil;
import cn.iocoder.mall.system.biz.bo.account.AccountBO;
import cn.iocoder.mall.system.biz.bo.ouath2.OAuth2AuthenticateBO;
import cn.iocoder.mall.system.biz.convert.oauth2.OAuth2Convert;
import cn.iocoder.mall.system.biz.dao.oauth2.OAuth2AccessTokenMapper;
import cn.iocoder.mall.system.biz.dao.oauth2.OAuth2RefreshTokenMapper;
import cn.iocoder.mall.system.biz.dataobject.oauth2.OAuth2AccessTokenDO;
import cn.iocoder.mall.system.biz.dataobject.oauth2.OAuth2RefreshTokenDO;
import cn.iocoder.mall.system.biz.dto.account.AccountCreateDTO;
import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2AccessTokenAuthenticateDTO;
import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2MobileCodeAuthenticateDTO;
import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2RefreshTokenAuthenticateDTO;
import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2UsernameAuthenticateDTO;
import cn.iocoder.mall.system.biz.service.account.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.UUID;
import static cn.iocoder.mall.system.biz.enums.SystemErrorCodeEnum.*;
@Service
public class OAuth2ServiceImpl implements OAuth2Service {
/**
* 访问令牌过期时间单位毫秒
*/
@Value("${modules.oauth2-code-service.access-token-expire-time-millis}")
private int accessTokenExpireTimeMillis;
/**
* 刷新令牌过期时间单位毫秒
*/
@Value("${modules.oauth2-code-service.refresh-token-expire-time-millis}")
private int refreshTokenExpireTimeMillis;
@Autowired
private AccountService accountService;
@Autowired
private OAuth2MobileCodeService oauth2MobileCodeService;
@Autowired
private OAuth2AccessTokenMapper oauth2AccessTokenMapper;
@Autowired
private OAuth2RefreshTokenMapper oauth2RefreshTokenMapper;
@Override
@Transactional
public OAuth2AuthenticateBO authenticate(OAuth2UsernameAuthenticateDTO authenticateDTO) {
// 获得账号
AccountBO accountBO = accountService.getByUsername(authenticateDTO.getUsername());
if (accountBO == null) {
throw ServiceExceptionUtil.exception(OAUTH2_ACCOUNT_NOT_FOUND);
}
// 校验密码
if (!accountService.matchPassword(authenticateDTO.getPassword(), accountBO.getPassword())) {
throw ServiceExceptionUtil.exception(OAUTH2_ACCOUNT_PASSWORD_ERROR);
}
// TODO 记录账号最后登陆时间和 ip
// 创建刷新令牌 + 访问令牌
OAuth2RefreshTokenDO oauth2RefreshTokenDO = createOAuth2RefreshToken(accountBO.getId());
OAuth2AccessTokenDO oauth2AccessTokenDO = createOAuth2AccessToken(accountBO.getId(), oauth2RefreshTokenDO.getId());
// 返回访问令牌
return OAuth2Convert.INSTANCE.convert(oauth2AccessTokenDO);
}
@Override
@Transactional
public OAuth2AuthenticateBO authenticate(OAuth2MobileCodeAuthenticateDTO authenticateDTO) {
// 校验手机格式
if (!ValidationUtil.isMobile(authenticateDTO.getMobile())) {
throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "手机格式不正确"); // TODO 有点搓
}
// 使用手机验证码如果验证不通过则会抛出异常
oauth2MobileCodeService.use(authenticateDTO.getMobile(), authenticateDTO.getCode());
// 获得账号
AccountBO accountBO = accountService.getByMobile(authenticateDTO.getMobile());
if (accountBO == null) { // 账号不存时自动创建
// 创建账号
accountBO = accountService.create(new AccountCreateDTO()
.setMobile(authenticateDTO.getMobile())
.setCreateIp(authenticateDTO.getIp())
);
}
// TODO 记录账号最后登陆时间和 ip
// 创建刷新令牌 + 访问令牌
OAuth2RefreshTokenDO oauth2RefreshTokenDO = createOAuth2RefreshToken(accountBO.getId());
OAuth2AccessTokenDO oauth2AccessTokenDO = createOAuth2AccessToken(accountBO.getId(), oauth2RefreshTokenDO.getId());
// 返回访问令牌
return OAuth2Convert.INSTANCE.convert(oauth2AccessTokenDO);
}
@Override
public OAuth2AuthenticateBO authenticate(OAuth2AccessTokenAuthenticateDTO authenticateDTO) {
OAuth2AccessTokenDO oauth2AccessTokenDO = oauth2AccessTokenMapper.selectById(authenticateDTO.getAccessToken());
if (oauth2AccessTokenDO == null) { // 不存在
throw ServiceExceptionUtil.exception(OAUTH2_ACCESS_TOKEN_NOT_FOUND);
}
if (oauth2AccessTokenDO.getExpiresTime().getTime() < System.currentTimeMillis()) { // 已过期
throw ServiceExceptionUtil.exception(OAUTH2_ACCESS_TOKEN_TOKEN_EXPIRED);
}
if (!oauth2AccessTokenDO.getValid()) { // 无效
throw ServiceExceptionUtil.exception(OAUTH2_ACCESS_TOKEN_INVALID);
}
// 转换返回
return OAuth2Convert.INSTANCE.convert(oauth2AccessTokenDO);
}
@Override
@Transactional
public OAuth2AuthenticateBO authenticate(OAuth2RefreshTokenAuthenticateDTO authenticateDTO) {
OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectById(authenticateDTO.getRefreshToken());
// 校验刷新令牌是否合法
if (refreshTokenDO == null) { // 不存在
throw ServiceExceptionUtil.exception(OAUTH2_REFRESH_TOKEN_NOT_FOUND);
}
if (refreshTokenDO.getExpiresTime().getTime() < System.currentTimeMillis()) { // 已过期
throw ServiceExceptionUtil.exception(OAUTH_REFRESH_TOKEN_EXPIRED);
}
if (!refreshTokenDO.getValid()) { // 无效
throw ServiceExceptionUtil.exception(OAUTH_REFRESH_TOKEN_INVALID);
}
// 标记 refreshToken 对应的 accessToken 都不合法
// 这块的实现参考了 Spring Security OAuth2 的代码
oauth2AccessTokenMapper.updateToInvalidByRefreshToken(authenticateDTO.getRefreshToken());
// 创建访问令牌
OAuth2AccessTokenDO oauth2AccessTokenDO = createOAuth2AccessToken(refreshTokenDO.getAccountId(),
refreshTokenDO.getId());
// 转换返回
return OAuth2Convert.INSTANCE.convert(oauth2AccessTokenDO);
}
private OAuth2AccessTokenDO createOAuth2AccessToken(Integer accountId, String refreshToken) {
OAuth2AccessTokenDO accessToken = new OAuth2AccessTokenDO()
.setId(generateAccessToken())
.setAccountId(accountId)
.setRefreshToken(refreshToken)
.setExpiresTime(new Date(System.currentTimeMillis() + accessTokenExpireTimeMillis))
.setValid(true);
oauth2AccessTokenMapper.insert(accessToken);
return accessToken;
}
private OAuth2RefreshTokenDO createOAuth2RefreshToken(Integer accountId) {
OAuth2RefreshTokenDO refreshToken = new OAuth2RefreshTokenDO()
.setId(generateRefreshToken())
.setAccountId(accountId)
.setExpiresTime(new Date(System.currentTimeMillis() + refreshTokenExpireTimeMillis))
.setValid(true);
oauth2RefreshTokenMapper.insert(refreshToken);
return refreshToken;
}
private String generateAccessToken() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
private String generateRefreshToken() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
}

View File

@ -1,8 +1,4 @@
##################### 业务模块 #####################
## OAuth2CodeService
## OAuth2Service
modules.oauth2-code-service.access-token-expire-time-millis = 2880000
modules.oauth2-code-service.refresh-token-expire-time-millis = 43200000
## OAuth2MobileCodeService
modules.oauth2-mobile-code-service.code-expire-time-millis = 600000
modules.oauth2-mobile-code-service.send-maximum-quantity-per-day = 10
modules.oauth2-mobile-code-service.send-frequency = 60000

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.system.rest.controller.admin;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.enums.MallConstants;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.security.core.annotation.RequiresPermissions;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.system.rest.controller.admin;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.enums.MallConstants;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.system.biz.bo.user.UserBO;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.system.rest.controller.authorization;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.enums.MallConstants;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.security.core.annotation.RequiresPermissions;
import cn.iocoder.mall.security.core.context.AdminSecurityContextHolder;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.system.rest.controller.authorization;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.enums.MallConstants;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.security.core.annotation.RequiresPermissions;
import cn.iocoder.mall.security.core.context.AdminSecurityContextHolder;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.system.rest.controller.authorization;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.enums.MallConstants;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.security.core.annotation.RequiresPermissions;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.system.rest.controller.datadict;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.enums.MallConstants;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.system.rest.controller.errorCode;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.enums.MallConstants;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.security.core.annotation.RequiresPermissions;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.system.rest.controller.oauth2;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.enums.MallConstants;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.security.core.annotation.RequiresNone;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.system.rest.controller.oauth2;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.enums.MallConstants;
import cn.iocoder.mall.system.biz.service.oauth2.OAuth2MobileCodeService;
import cn.iocoder.mall.system.biz.service.oauth2.OAuth2Service;
import cn.iocoder.mall.system.biz.service.user.UserService;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.system.api.dto.admin;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.validator.InEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

View File

@ -1,8 +1,8 @@
package cn.iocoder.mall.admin.service;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.constant.DeletedStatusEnum;
import cn.iocoder.common.framework.constant.UserTypeEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.enums.DeletedStatusEnum;
import cn.iocoder.common.framework.enums.UserTypeEnum;
import cn.iocoder.common.framework.util.CollectionUtil;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.vo.PageResult;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.admin.service;
import cn.iocoder.common.framework.constant.DeletedStatusEnum;
import cn.iocoder.common.framework.enums.DeletedStatusEnum;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.system.api.DataDictService;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.admin.service;
import cn.iocoder.common.framework.constant.DeletedStatusEnum;
import cn.iocoder.common.framework.enums.DeletedStatusEnum;
import cn.iocoder.common.framework.exception.ServiceException;
import cn.iocoder.mall.system.api.SmsService;
import cn.iocoder.mall.system.api.bo.sms.PageSmsSignBO;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.system.application.controller.admins;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.enums.MallConstants;
import cn.iocoder.common.framework.util.CollectionUtil;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;

View File

@ -1,12 +1,16 @@
package cn.iocoder.mall.userservice.rpc.user.vo;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 用户响应
*/
@Data
@Accessors(chain = true)
public class UserVO implements Serializable {
/**

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.userservice.dal.mysql.dataobject.user;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.mall.mybatis.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.userservice.service.sms;
import cn.iocoder.common.framework.constant.SysErrorCodeEnum;
import cn.iocoder.common.framework.enums.SysErrorCodeEnum;
import cn.iocoder.common.framework.exception.ServiceException;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.util.ValidationUtil;

View File

@ -1,6 +1,6 @@
package cn.iocoder.mall.userservice.service.user;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.util.DigestUtils;
import cn.iocoder.common.framework.util.StringUtils;
import cn.iocoder.mall.userservice.convert.user.UserConvert;

View File

@ -1,10 +1,14 @@
package cn.iocoder.mall.userservice.service.user.bo;
import cn.iocoder.common.framework.constant.CommonStatusEnum;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 用户信息
*/
@Data
@Accessors(chain = true)
public class UserBO {
/**

View File

@ -43,6 +43,12 @@
<artifactId>user-service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- 系统服务 -->
<groupId>cn.iocoder.mall</groupId>
<artifactId>system-service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Registry 和 Config 相关 -->
<dependency>

View File

@ -27,10 +27,6 @@ public class UserPassportVO {
* 刷新令牌
*/
private String refreshToken;
/**
* 账号编号
*/
private Integer accountId;
/**
* 过期时间
*/

View File

@ -1,5 +1,6 @@
package cn.iocoder.mall.userweb.convert.passport;
import cn.iocoder.mall.systemservice.rpc.oauth.vo.OAuth2AccessTokenVO;
import cn.iocoder.mall.userservice.rpc.sms.vo.UserSendSmsCodeDTO;
import cn.iocoder.mall.userservice.rpc.sms.vo.UserVerifySmsCodeDTO;
import cn.iocoder.mall.userservice.rpc.user.dto.UserCreateDTO;
@ -16,10 +17,13 @@ public interface UserPassportConvert {
UserPassportConvert INSTANCE = Mappers.getMapper(UserPassportConvert.class);
UserVerifySmsCodeDTO convert(UserPassportLoginBySmsDTO bean);
UserCreateDTO convert02(UserPassportLoginBySmsDTO bean);
UserPassportVO convert(UserVO userVO);
default UserPassportVO convert(UserVO userVO, OAuth2AccessTokenVO accessTokenVO) {
return new UserPassportVO().setUser(convert(userVO)).setAuthorization(convert(accessTokenVO));
}
UserPassportVO.User convert(UserVO userVO);
UserPassportVO.Authentication convert(OAuth2AccessTokenVO accessTokenVO);
UserSendSmsCodeDTO convert(UserPassportSendSmsCodeDTO bean);

View File

@ -1,6 +1,10 @@
package cn.iocoder.mall.userweb.manager.passport;
import cn.iocoder.common.framework.enums.UserTypeEnum;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.systemservice.rpc.oauth.OAuth2Rpc;
import cn.iocoder.mall.systemservice.rpc.oauth.dto.OAuth2CreateAccessTokenDTO;
import cn.iocoder.mall.systemservice.rpc.oauth.vo.OAuth2AccessTokenVO;
import cn.iocoder.mall.userservice.enums.sms.UserSmsSceneEnum;
import cn.iocoder.mall.userservice.rpc.sms.UserSmsCodeRpc;
import cn.iocoder.mall.userservice.rpc.user.UserRpc;
@ -19,21 +23,30 @@ public class UserPassportManager {
private UserSmsCodeRpc userSmsCodeRpc;
@Reference(version = "${dubbo.consumer.UserRpc.version}", validation = "false")
private UserRpc userRpc;
@Reference(version = "${dubbo.consumer.OAuth2Rpc.version}", validation = "false")
private OAuth2Rpc oauth2Rpc;
public UserPassportVO loginBySms(UserPassportLoginBySmsDTO loginBySmsDTO, String ip) {
// 校验验证码
CommonResult<Boolean> verifySmsCodeResult = userSmsCodeRpc.verifySmsCode(UserPassportConvert.INSTANCE.convert(loginBySmsDTO)
.setScene(UserSmsSceneEnum.LOGIN_BY_SMS.getValue()).setIp(ip));
CommonResult<Boolean> verifySmsCodeResult = userSmsCodeRpc.verifySmsCode(
UserPassportConvert.INSTANCE.convert(loginBySmsDTO).setScene(UserSmsSceneEnum.LOGIN_BY_SMS.getValue()).setIp(ip));
verifySmsCodeResult.checkError();
// 获得用户
CommonResult<UserVO> createUserResult = userRpc.createUserIfAbsent(UserPassportConvert.INSTANCE.convert02(loginBySmsDTO).setIp(ip));
CommonResult<UserVO> createUserResult = userRpc.createUserIfAbsent(
UserPassportConvert.INSTANCE.convert02(loginBySmsDTO).setIp(ip));
createUserResult.checkError();
// 创建访问令牌
return UserPassportConvert.INSTANCE.convert(createUserResult.getData());
CommonResult<OAuth2AccessTokenVO> createAccessTokenResult = oauth2Rpc.createAccessToken(
new OAuth2CreateAccessTokenDTO().setUserId(createUserResult.getData().getId())
.setUserType(UserTypeEnum.USER.getValue()).setCreateIp(ip));
createAccessTokenResult.checkError();
// 返回
return UserPassportConvert.INSTANCE.convert(createUserResult.getData(), createAccessTokenResult.getData());
}
public void sendSmsCode(UserPassportSendSmsCodeDTO sendSmsCodeDTO, String ip) {
CommonResult<Boolean> sendSmsCodeResult = userSmsCodeRpc.sendSmsCode(UserPassportConvert.INSTANCE.convert(sendSmsCodeDTO).setIp(ip));
CommonResult<Boolean> sendSmsCodeResult = userSmsCodeRpc.sendSmsCode(
UserPassportConvert.INSTANCE.convert(sendSmsCodeDTO).setIp(ip));
sendSmsCodeResult.checkError();
}

View File

@ -16,7 +16,7 @@ spring:
dubbo:
# Spring Cloud Alibaba Dubbo 专属配置
cloud:
subscribed-services: 'user-service' # 设置订阅的应用列表,默认为 * 订阅所有应用
subscribed-services: 'user-service, system-service' # 设置订阅的应用列表,默认为 * 订阅所有应用
# Dubbo 服务消费者的配置
consumer:
timeout: 10000
@ -24,3 +24,5 @@ dubbo:
version: 1.0.0
UserRpc:
version: 1.0.0
OAuth2Rpc:
version: 1.0.0