通用模块开发

This commit is contained in:
haoxin963
2021-06-23 23:31:21 +08:00
parent df06ebb8f6
commit c77d7ca743
17 changed files with 144 additions and 24 deletions

View File

@@ -72,11 +72,11 @@ public interface AuthConstants {
*/
String BCRYPT = "{bcrypt}";
String USER_ID_KEY = "user_id";
String USER_ID_KEY = "userId";
String USER_NAME_KEY = "userName";
String CLIENT_ID_KEY = "client_id";
String TENANT_ID_KEY = "tenantId";
/**
* JWT存储权限前缀

View File

@@ -1,2 +1,2 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xtoon.cloud.common.web.util.BaseExceptionHandler
com.xtoon.cloud.common.web.util.BaseExceptionHandler

View File

@@ -113,6 +113,7 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap
User user = (User) authentication.getUserAuthentication().getPrincipal();
map.put(AuthConstants.USER_ID_KEY, user.getId());
map.put(AuthConstants.USER_NAME_KEY, user.getUsername());
map.put(AuthConstants.TENANT_ID_KEY, user.getTenantId());
((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(map);
return accessToken;
};

View File

@@ -28,7 +28,7 @@ public class User implements UserDetails {
private Boolean enabled;
private String clientId;
private String tenantId;
private Collection<GrantedAuthority> authorities;
@@ -37,6 +37,7 @@ public class User implements UserDetails {
this.setUsername(authenticationDTO.getUserName());
this.setPassword(AuthConstants.BCRYPT + authenticationDTO.getPassword());
this.setEnabled(StatusEnum.ENABLE.getValue().equals(authenticationDTO.getStatus()));
this.setTenantId(authenticationDTO.getTenantId());
this.authorities = AuthorityUtils.commaSeparatedStringToAuthorityList(StringUtils.join(authenticationDTO.getPermissionCodes(), ","));
}

View File

@@ -44,8 +44,9 @@ public class CaptchaFilter extends OncePerRequestFilter {
httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
httpServletResponse.setStatus(HttpServletResponse.SC_OK);
httpServletResponse.getOutputStream().write(JSONObject.toJSONString(Result.error("验证码不正确")).getBytes());
} else {
filterChain.doFilter(httpServletRequest, httpServletResponse);
}
filterChain.doFilter(httpServletRequest, httpServletResponse);
} else {
filterChain.doFilter(httpServletRequest, httpServletResponse);
}

View File

@@ -58,10 +58,10 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered {
}
// 存在token且不是黑名单request写入JWT的载体信息
String tenantId = request.getHeaders().getFirst(CommonConstant.TENANT_ID);
// String tenantId = request.getHeaders().getFirst(CommonConstant.TENANT_ID);
request = exchange.getRequest().mutate()
.header(AuthConstants.JWT_PAYLOAD_KEY, payload)
.header(CommonConstant.TENANT_ID, tenantId)
// .header(CommonConstant.TENANT_ID, tenantId)
.build();
exchange = exchange.mutate().request(request).build();
return chain.filter(exchange);

View File

@@ -34,6 +34,11 @@ public class AuthenticationDTO implements Serializable {
*/
private String status;
/**
* 租户ID
*/
private String tenantId;
/**
* 权限编码
*/

View File

@@ -84,5 +84,28 @@
<artifactId>dubbo</artifactId>
<version>2.7.8</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.json</include>
<include>**/*.ftl</include>
</includes>
</resource>
</resources>
</build>
</project>

View File

@@ -11,6 +11,7 @@ import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
@@ -21,6 +22,7 @@ import org.springframework.web.bind.annotation.RestController;
**/
@Api(tags = "注册")
@RestController
@RequestMapping("/register")
public class RegisterController {
@Autowired
@@ -31,7 +33,7 @@ public class RegisterController {
*/
@ApiOperation("注册租户")
@SysLog("注册租户")
@PostMapping("/registerTenant")
@PostMapping("/tenant")
public Result registerTenantAndUser(@RequestBody RegisterTenantCommand registerTenantCommand) {
ValidatorUtils.validateEntity(registerTenantCommand, AddGroup.class);
registerApplicationService.registerTenant(registerTenantCommand);

View File

@@ -16,6 +16,7 @@ public class AuthenticationDTOAssembler {
authenticationDTO.setUserId(user.getUserId().getId());
authenticationDTO.setUserName(user.getUserName().getName());
authenticationDTO.setPassword(user.getAccount().getPassword().getPassword());
authenticationDTO.setTenantId(user.getTenantId().getId());
authenticationDTO.setStatus(user.getStatus().getValue());
return authenticationDTO;
}

View File

@@ -1,9 +1,7 @@
package com.xtoon.cloud.sys.application.impl;
import com.google.code.kaptcha.Producer;
import com.xtoon.cloud.sys.application.PermissionQueryService;
import com.xtoon.cloud.sys.application.assembler.AuthenticationDTOAssembler;
import com.xtoon.cloud.sys.domain.model.captcha.Captcha;
import com.xtoon.cloud.sys.domain.model.captcha.CaptchaCode;
import com.xtoon.cloud.sys.domain.model.captcha.CaptchaRepository;
import com.xtoon.cloud.sys.domain.model.captcha.Uuid;
@@ -14,11 +12,9 @@ import com.xtoon.cloud.sys.domain.service.CaptchaValidateService;
import com.xtoon.cloud.sys.dto.AuthenticationDTO;
import com.xtoon.cloud.sys.service.AuthenticationService;
import org.apache.commons.lang.StringUtils;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.awt.image.BufferedImage;
import java.util.List;
/**
@@ -27,7 +23,7 @@ import java.util.List;
* @author haoxin
* @date 2021-05-10
**/
@Service
@DubboService
public class AuthenticationServiceImpl implements AuthenticationService {
@Autowired

View File

@@ -2,7 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xtoon.cloud.sys.infrastructure.persistence.mapper.SysPermissionMapper">
<select id="queryList" parameterType="Map" resultType="com.xtoon.boot.sys.infrastructure.persistence.entity.SysPermissionDO">
<select id="queryList" parameterType="Map" resultType="com.xtoon.cloud.sys.infrastructure.persistence.entity.SysPermissionDO">
select p.* from sys_permission p
<where>
and p.del_flag = '0'
@@ -13,20 +13,20 @@
order by p.order_num asc
</select>
<select id="queryPermissionByRoleId" resultType="com.xtoon.boot.sys.infrastructure.persistence.entity.SysPermissionDO">
<select id="queryPermissionByRoleId" resultType="com.xtoon.cloud.sys.infrastructure.persistence.entity.SysPermissionDO">
select p.* from sys_role_permission rp
LEFT JOIN sys_permission p on rp.permission_id = p.id
where rp.role_id = #{roleId} and p.del_flag = '0' and p.status = '0'
</select>
<select id="queryPermissionByRoleCode" resultType="com.xtoon.boot.sys.infrastructure.persistence.entity.SysPermissionDO">
<select id="queryPermissionByRoleCode" resultType="com.xtoon.cloud.sys.infrastructure.persistence.entity.SysPermissionDO">
select p.* from sys_role_permission rp
LEFT JOIN sys_permission p on rp.permission_id = p.id
LEFT JOIN sys_role r on r.id = rp.role_id
where r.role_code = #{roleId} and p.del_flag = '0' and p.status = '0'
</select>
<select id="queryPermissionByUserId" resultType="com.xtoon.boot.sys.infrastructure.persistence.entity.SysPermissionDO">
<select id="queryPermissionByUserId" resultType="com.xtoon.cloud.sys.infrastructure.persistence.entity.SysPermissionDO">
SELECT p.* FROM sys_role_permission rp
LEFT JOIN sys_permission p ON rp.permission_id = p.id
LEFT JOIN sys_user_role ur ON rp.role_id = ur.role_id

View File

@@ -2,7 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xtoon.cloud.sys.infrastructure.persistence.mapper.SysRoleMapper">
<select id="queryList" parameterType="Map" resultType="com.xtoon.boot.sys.infrastructure.persistence.entity.SysRoleDO">
<select id="queryList" parameterType="Map" resultType="com.xtoon.cloud.sys.infrastructure.persistence.entity.SysRoleDO">
select r.* from sys_role r
<where>
and r.del_flag = '0'
@@ -13,7 +13,7 @@
ORDER BY r.id desc
</select>
<select id="queryUserRole" resultType="com.xtoon.boot.sys.infrastructure.persistence.entity.SysRoleDO">
<select id="queryUserRole" resultType="com.xtoon.cloud.sys.infrastructure.persistence.entity.SysRoleDO">
select r.* from sys_role r
INNER JOIN sys_user_role ur on ur.role_id = r.id
where ur.user_id = #{userId} and r.del_flag = '0' and r.status = '0'

View File

@@ -2,7 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xtoon.cloud.sys.infrastructure.persistence.mapper.SysTenantMapper">
<select id="queryPage" parameterType="Map" resultType="com.xtoon.boot.sys.infrastructure.persistence.entity.SysTenantDO">
<select id="queryPage" parameterType="Map" resultType="com.xtoon.cloud.sys.infrastructure.persistence.entity.SysTenantDO">
SELECT
t.*
FROM

View File

@@ -3,7 +3,7 @@
<mapper namespace="com.xtoon.cloud.sys.infrastructure.persistence.mapper.SysUserMapper">
<select id="queryPage" parameterType="Map"
resultType="com.xtoon.boot.sys.infrastructure.persistence.entity.SysUserDO">
resultType="com.xtoon.cloud.sys.infrastructure.persistence.entity.SysUserDO">
SELECT
u.*,a.email,a.mobile
FROM
@@ -27,7 +27,7 @@
</select>
<select id="queryUser" parameterType="Map"
resultType="com.xtoon.boot.sys.infrastructure.persistence.entity.SysUserDO">
resultType="com.xtoon.cloud.sys.infrastructure.persistence.entity.SysUserDO">
SELECT
u.*,t.tenant_code,t.tenant_name
FROM
@@ -46,7 +46,7 @@
</select>
<select id="queryUserNoTenant" parameterType="Map"
resultType="com.xtoon.boot.sys.infrastructure.persistence.entity.SysUserDO">
resultType="com.xtoon.cloud.sys.infrastructure.persistence.entity.SysUserDO">
SELECT
u.*,t.tenant_code,t.tenant_name
FROM

View File

@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<!-- 开发、测试环境 -->
<springProfile name="dev">
<logger name="org.springframework.web" level="INFO"/>
<logger name="org.springboot.sample" level="INFO" />
<logger name="com.xtoon" level="DEBUG" />
</springProfile>
<springProfile name="test,prod">
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<!--定义了一个过滤器,在LEVEL之下的日志输出不会被打印出来-->
<!--这里定义了ERROR也就是控制台不会输出比ERROR级别小的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{HH:mm:ss.SSS} %-5level %logger{80} - %msg%n</Pattern>
</encoder>
</appender>
<appender name="xtoon-web"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>
/var/logs/xtoon/xtoon_web.log
</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>/var/logs/xtoon/xtoon_web.log.%d{yyyy-MM-dd}</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="xtoon-error"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<file>
/var/logs/xtoon/xtoon_error.log
</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>/var/logs/xtoon/xtoon_error.log.%d{yyyy-MM-dd}</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--root是默认的logger 这里设定输出级别是DEBUG-->
<root level="ERROR">
<appender-ref ref="STDOUT"/>
</root>
<!--这个logger没有指定appender它会继承root节点中定义的那些appender-->
<logger name="org.springframework.web" level="INFO"/>
<logger name="org.springboot.sample" level="INFO" />
<logger name="com.xtoon" level="INFO" additivity="false">
<appender-ref ref="xtoon-web"/>
<appender-ref ref="xtoon-error"/>
</logger>
</springProfile>
</configuration>

View File

@@ -0,0 +1,17 @@
package com.xtoon.cloud.sys.domain.model.user;
import org.junit.jupiter.api.Test;
/**
* 密码测试
*
* @author haoxin
* @date 2021-06-23
**/
public class PasswordTest {
@Test
public void create() {
System.out.println(Password.create("123456"));
}
}