提交 ca26ac69 作者: 洪东保

Merge branch 'hongdongbao'

target/
logs/
log.path_IS_UNDEFINED/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
......
......@@ -363,6 +363,28 @@
</executions>
<version>2.7.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<configuration>
<filesets>
<!-- 默认删除 target 目录 -->
<fileset>
<directory>target</directory>
<followSymlinks>false</followSymlinks>
</fileset>
<!-- 额外删除 logs 目录 -->
<fileset>
<directory>logs</directory>
<followSymlinks>false</followSymlinks>
</fileset>
<fileset>
<directory>log.path_IS_UNDEFINED</directory>
<followSymlinks>false</followSymlinks>
</fileset>
</filesets>
</configuration>
</plugin>
</plugins>
</build>
......
......@@ -93,7 +93,8 @@ public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticat
try {
String uid = details.get("userId");
String tenantId = details.get("tenantId");
UserDetails loadedUser = this.getCustomUserDetailsService().loadUser(uid, tenantId);
String role = details.get("role");
UserDetails loadedUser = this.getCustomUserDetailsService().loadUser(uid, tenantId, role);
if (loadedUser == null) {
throw new InternalAuthenticationServiceException(
"customUserDetailsService returned null, which is an interface contract violation");
......
......@@ -2,6 +2,7 @@ package com.cmeeting.ad.controller;
import com.cmeeting.ad.service.UserService;
import com.cmeeting.ad.vo.UserVo;
import com.cmeeting.constant.RecordTemplateConstant;
import com.cmeeting.util.IPUtils;
import com.cmeeting.util.R;
import com.cmeeting.ad.vo.ApplicationUserVO;
......@@ -31,11 +32,21 @@ public class UserController {
return userService.login(vo.getAgentId(), vo.getData(), ipAddr);
}
/**
* 超管登录
* @param vo
* @return
*/
@PostMapping(value = "/auth")
public R auth(@Validated @RequestBody UserVo.Auth vo) {
return R.ok(userService.auth(vo));
return R.ok(userService.auth(vo, RecordTemplateConstant.TEMPLATE_TYPE_SYSTEM));
}
/**
* 用户使用
* @param vo
* @return
*/
@PostMapping(value = "/tokenAuth")
public R tokenAuth(@Validated @RequestBody ApplicationUserVO.LoginDecrypt vo) {
try {
......
......@@ -37,13 +37,16 @@ public class RobotSecurityUser implements UserDetails {
private String password;
private String tenantId;
/**
* system / custom
*/
private String role;
/**
*
* 用户与租户区别字段
*/
private Integer type;
@JsonIgnore
private Collection<? extends GrantedAuthority> authorities;
private RoleTree menus;
private SysPlatformSetting sysPlatformSetting;
......
......@@ -6,7 +6,7 @@ import org.springframework.security.core.userdetails.UserDetails;
* 写这个方法的目的是为了让业务实现层能够根据类型执行对应的业务逻辑
*/
public interface CustomUserDetailsService {
UserDetails loadUser(String uid, String tenantId);
UserDetails loadUser(String uid, String tenantId, String role);
}
......@@ -13,7 +13,7 @@ import java.util.List;
public interface UserService {
R login(String agentId, String data, String ip);
String auth(UserVo.Auth vo);
String auth(UserVo.Auth vo, String role);
List<String> getRoleIdByUserId(String tenantId, String userId, String path);
......
......@@ -31,7 +31,7 @@ public class DetailsServiceImpl implements CustomUserDetailsService {
* @throws UsernameNotFoundException 用户不存在
*/
@Override
public UserDetails loadUser(String uid, String tenantId) {
public UserDetails loadUser(String uid, String tenantId, String role) {
RobotSecurityUser user = new RobotSecurityUser();
user.setUserType(UserTypeConstant.SYNC);
String url = userAdminConfig.getUserAdminDomain() + UserAdminRouteConstant.SyncUser.INFO + "?id=" + uid + "&tenantId=" + tenantId;
......@@ -41,6 +41,7 @@ public class DetailsServiceImpl implements CustomUserDetailsService {
user.setUsername(data.getString("name"));
user.setNick(data.getString("nickName"));
user.setTenantId(data.getString("tenantId"));
user.setRole(role);
return user;
}
}
......@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cmeeting.ad.entity.*;
import com.cmeeting.ad.util.SecurityUtil;
import com.cmeeting.ad.vo.UserVo;
import com.cmeeting.constant.RecordTemplateConstant;
import com.cmeeting.dto.UserDTO;
import com.cmeeting.exception.RobotBaseException;
import com.cmeeting.mapper.primary.AuthMapper;
......@@ -88,13 +89,14 @@ public class UserServiceImpl implements UserService {
}
@Override
public String auth(UserVo.Auth vo) {
public String auth(UserVo.Auth vo, String role) {
String userId = vo.getId();
String nick = vo.getNick();
HashMap<String, String> stringStringHashMap = new HashMap<>();
SysTenant sysTenant = iTenantService.getById(permissionTenantId);
stringStringHashMap.put("userId", userId);
stringStringHashMap.put("tenantId", permissionTenantId);
stringStringHashMap.put("role", role);
stringStringHashMap.put("language", sysTenant.getLanguage());
stringStringHashMap.put("nick", nick);
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userId, permissionTenantId);
......@@ -225,7 +227,7 @@ public class UserServiceImpl implements UserService {
}
UserVo.Auth authParams = UserVo.Auth.builder().id(userId).nick(robotSecurityUser.getNickName()).build();
String token = auth(authParams);
String token = auth(authParams, RecordTemplateConstant.TEMPLATE_TYPE_CUSTOM);
return token;
}
......
package com.cmeeting.constant;
public interface RecordTemplateConstant {
/**
* 管理员
*/
String TEMPLATE_TYPE_SYSTEM = "system";
/**
* 用户
*/
String TEMPLATE_TYPE_CUSTOM = "custom";
/**
......
......@@ -9,6 +9,7 @@ import com.cmeeting.service.ModulePermissionService;
import com.cmeeting.util.R;
import com.cmeeting.vo.AuthVO;
import com.cmeeting.vo.PermissionVO;
import org.jetbrains.annotations.NotNull;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -78,17 +79,17 @@ public class PermissionController {
* 用户自己取消使用生成纪要功能列表
* @return
*/
@GetMapping("/personalCancelList")
public R personalCancelList() {
@GetMapping("/cancelList")
public R cancelList() {
return R.ok(modulePermissionService.personalCancelList());
}
/**
* 用户自己取消使用生成纪要功能
*/
@GetMapping("/personalCancel")
public R personalCancel() {
return R.ok(modulePermissionService.personalCancel(SecurityUtil.getUser().getUserId()));
@GetMapping("/personalSwitch")
public R personalSwitch(@Validated@NotNull Boolean enable) {
return R.ok(modulePermissionService.personalSwitch(SecurityUtil.getUser().getId(), enable));
}
......
......@@ -24,5 +24,5 @@ public interface ModulePermissionService extends IService<ModulePermission> {
List<PermissionCheckedDTO.User> personalCancelList();
boolean personalCancel(String userId);
Boolean personalSwitch(String userId, boolean enable);
}
......@@ -171,17 +171,32 @@ public class ModulePermissionServiceImpl extends ServiceImpl<ModulePermissionMap
@Override
@Transactional(rollbackFor = Exception.class)
public boolean personalCancel(String userId) {
this.remove(new LambdaQueryWrapper<ModulePermission>()
.eq(ModulePermission::getType, RecordTemplateConstant.REL_TYPE_USER)
.eq(ModulePermission::getPurpose, PermissionPruposeType.ADMIN_AUTH)
.eq(ModulePermission::getRelId, userId));
ModulePermission cancel = ModulePermission.builder()
.type(RecordTemplateConstant.REL_TYPE_USER)
.purpose(PermissionPruposeType.PERSONAL_CLOSE)
.relId(userId)
.createTime(new Date()).build();
return this.save(cancel);
public Boolean personalSwitch(String userId, boolean enable) {
if (enable) {
this.remove(new LambdaQueryWrapper<ModulePermission>()
.eq(ModulePermission::getType, RecordTemplateConstant.REL_TYPE_USER)
.eq(ModulePermission::getPurpose, PermissionPruposeType.PERSONAL_CLOSE)
.eq(ModulePermission::getRelId, userId));
ModulePermission cancel = ModulePermission.builder()
.type(RecordTemplateConstant.REL_TYPE_USER)
.purpose(PermissionPruposeType.ADMIN_AUTH)
.userType(UserTypeConstant.SYNC)
.relId(userId)
.createTime(new Date()).build();
return this.save(cancel);
} else {
this.remove(new LambdaQueryWrapper<ModulePermission>()
.eq(ModulePermission::getType, RecordTemplateConstant.REL_TYPE_USER)
.eq(ModulePermission::getPurpose, PermissionPruposeType.ADMIN_AUTH)
.eq(ModulePermission::getRelId, userId));
ModulePermission cancel = ModulePermission.builder()
.type(RecordTemplateConstant.REL_TYPE_USER)
.purpose(PermissionPruposeType.PERSONAL_CLOSE)
.userType(UserTypeConstant.SYNC)
.relId(userId)
.createTime(new Date()).build();
return this.save(cancel);
}
}
}
......
......@@ -149,10 +149,10 @@ permission:
tenantId: ${PERMISSION_TENANT_ID}
admin-white_users: ${PERMISSION_ADMIN_WHITE_USERS}
logging:
level:
com.cmeeting.mapper.primary: TRACE
com.cmeeting.mapper.secondary: TRACE
root: INFO
#logging:
# level:
# com.cmeeting.mapper.primary: INFO
# com.cmeeting.mapper.secondary: INFO
# root: INFO
isDev: true
\ No newline at end of file
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<?xml version="1.0" encoding="UTF-8"?>
<configuration
scan="true"
scanPeriod="10 seconds">
<contextName>
logback
</contextName>
<springProperty
scope="context"
name="springAppName"
source="spring.application.name"/>
<springProperty
scope="context"
name="logPath"
source="spring.application.logPath"/>
<!-- 日志储存空间位置 -->
<springProperty
name="log.path"
source="logPath"
defaultValue="./logs"/>
<!-- 彩色日志 -->
<conversionRule
conversionWord="clr"
converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule
conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule
conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 彩色日志格式 -->
<property
name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 输出到控制台 -->
<appender
name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender">
<!-- 此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>
debug
</level>
</filter>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
<Pattern>
${CONSOLE_LOG_PATTERN}
</Pattern>
<!-- 设置字符集 -->
<charset>
UTF-8
</charset>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<!-- 输出到文件 -->
<appender
name="FILE_ALL"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<!-- <file>-->
<!-- ${log.path}/log_all.log-->
<!-- </file>-->
<!-- 日志文件输出格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>
<charset>
UTF-8
</charset>
<!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档 -->
<fileNamePattern>
${log.path}/cmeeting_%d{yyyyMMdd}_%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>
200MB
</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 日志文件保留天数 -->
<maxHistory>
15
</maxHistory>
</rollingPolicy>
</appender>
<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender
name="ERROR_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>
${log.path}/log_error.log
</file>
<!-- 日志文件输出格式 -->
<encoder>
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level%logger{36}.%M\(%line\)-%msg%n
</pattern>
<charset>
UTF-8
</charset>
<!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>
${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log.gz
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>
100MB
</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 日志文件保留天数 -->
<maxHistory>
15
</maxHistory>
</rollingPolicy>
<!-- 过滤出ERROR级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level> ERROR </level>
<onMatch> ACCEPT </onMatch>
<onMismatch> DENY </onMismatch>
</filter>
</appender>
<!-- MyBatis SQL 日志 -->
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<logger name="java.sql.ResultSet" level="DEBUG"/>
<!-- DAO 包路径(替换为你的Mapper接口包名) -->
<logger name="com.cmeeting.mapper.primary" level="DEBUG"/>
<logger name="com.cmeeting.mapper.secondary" level="DEBUG"/>
<!-- 日志总开关 -->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_ALL"/>
<appender-ref ref="ERROR_FILE"/>
</root>
</configuration>
package test;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.tencentcloudapi.wemeet.Client;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论