提交 ca26ac69 作者: 洪东保

Merge branch 'hongdongbao'

target/ target/
logs/
log.path_IS_UNDEFINED/
!.mvn/wrapper/maven-wrapper.jar !.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/ !**/src/main/**/target/
!**/src/test/**/target/ !**/src/test/**/target/
......
...@@ -363,6 +363,28 @@ ...@@ -363,6 +363,28 @@
</executions> </executions>
<version>2.7.0</version> <version>2.7.0</version>
</plugin> </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> </plugins>
</build> </build>
......
...@@ -93,7 +93,8 @@ public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticat ...@@ -93,7 +93,8 @@ public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticat
try { try {
String uid = details.get("userId"); String uid = details.get("userId");
String tenantId = details.get("tenantId"); 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) { if (loadedUser == null) {
throw new InternalAuthenticationServiceException( throw new InternalAuthenticationServiceException(
"customUserDetailsService returned null, which is an interface contract violation"); "customUserDetailsService returned null, which is an interface contract violation");
......
...@@ -2,6 +2,7 @@ package com.cmeeting.ad.controller; ...@@ -2,6 +2,7 @@ package com.cmeeting.ad.controller;
import com.cmeeting.ad.service.UserService; import com.cmeeting.ad.service.UserService;
import com.cmeeting.ad.vo.UserVo; import com.cmeeting.ad.vo.UserVo;
import com.cmeeting.constant.RecordTemplateConstant;
import com.cmeeting.util.IPUtils; import com.cmeeting.util.IPUtils;
import com.cmeeting.util.R; import com.cmeeting.util.R;
import com.cmeeting.ad.vo.ApplicationUserVO; import com.cmeeting.ad.vo.ApplicationUserVO;
...@@ -31,11 +32,21 @@ public class UserController { ...@@ -31,11 +32,21 @@ public class UserController {
return userService.login(vo.getAgentId(), vo.getData(), ipAddr); return userService.login(vo.getAgentId(), vo.getData(), ipAddr);
} }
/**
* 超管登录
* @param vo
* @return
*/
@PostMapping(value = "/auth") @PostMapping(value = "/auth")
public R auth(@Validated @RequestBody UserVo.Auth vo) { 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") @PostMapping(value = "/tokenAuth")
public R tokenAuth(@Validated @RequestBody ApplicationUserVO.LoginDecrypt vo) { public R tokenAuth(@Validated @RequestBody ApplicationUserVO.LoginDecrypt vo) {
try { try {
......
...@@ -37,13 +37,16 @@ public class RobotSecurityUser implements UserDetails { ...@@ -37,13 +37,16 @@ public class RobotSecurityUser implements UserDetails {
private String password; private String password;
private String tenantId; private String tenantId;
/** /**
* system / custom
*/
private String role;
/**
* *
* 用户与租户区别字段 * 用户与租户区别字段
*/ */
private Integer type; private Integer type;
@JsonIgnore @JsonIgnore
private Collection<? extends GrantedAuthority> authorities; private Collection<? extends GrantedAuthority> authorities;
private RoleTree menus;
private SysPlatformSetting sysPlatformSetting; private SysPlatformSetting sysPlatformSetting;
......
...@@ -6,7 +6,7 @@ import org.springframework.security.core.userdetails.UserDetails; ...@@ -6,7 +6,7 @@ import org.springframework.security.core.userdetails.UserDetails;
* 写这个方法的目的是为了让业务实现层能够根据类型执行对应的业务逻辑 * 写这个方法的目的是为了让业务实现层能够根据类型执行对应的业务逻辑
*/ */
public interface CustomUserDetailsService { 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; ...@@ -13,7 +13,7 @@ import java.util.List;
public interface UserService { public interface UserService {
R login(String agentId, String data, String ip); 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); List<String> getRoleIdByUserId(String tenantId, String userId, String path);
......
...@@ -31,7 +31,7 @@ public class DetailsServiceImpl implements CustomUserDetailsService { ...@@ -31,7 +31,7 @@ public class DetailsServiceImpl implements CustomUserDetailsService {
* @throws UsernameNotFoundException 用户不存在 * @throws UsernameNotFoundException 用户不存在
*/ */
@Override @Override
public UserDetails loadUser(String uid, String tenantId) { public UserDetails loadUser(String uid, String tenantId, String role) {
RobotSecurityUser user = new RobotSecurityUser(); RobotSecurityUser user = new RobotSecurityUser();
user.setUserType(UserTypeConstant.SYNC); user.setUserType(UserTypeConstant.SYNC);
String url = userAdminConfig.getUserAdminDomain() + UserAdminRouteConstant.SyncUser.INFO + "?id=" + uid + "&tenantId=" + tenantId; String url = userAdminConfig.getUserAdminDomain() + UserAdminRouteConstant.SyncUser.INFO + "?id=" + uid + "&tenantId=" + tenantId;
...@@ -41,6 +41,7 @@ public class DetailsServiceImpl implements CustomUserDetailsService { ...@@ -41,6 +41,7 @@ public class DetailsServiceImpl implements CustomUserDetailsService {
user.setUsername(data.getString("name")); user.setUsername(data.getString("name"));
user.setNick(data.getString("nickName")); user.setNick(data.getString("nickName"));
user.setTenantId(data.getString("tenantId")); user.setTenantId(data.getString("tenantId"));
user.setRole(role);
return user; return user;
} }
} }
...@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; ...@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cmeeting.ad.entity.*; import com.cmeeting.ad.entity.*;
import com.cmeeting.ad.util.SecurityUtil; import com.cmeeting.ad.util.SecurityUtil;
import com.cmeeting.ad.vo.UserVo; import com.cmeeting.ad.vo.UserVo;
import com.cmeeting.constant.RecordTemplateConstant;
import com.cmeeting.dto.UserDTO; import com.cmeeting.dto.UserDTO;
import com.cmeeting.exception.RobotBaseException; import com.cmeeting.exception.RobotBaseException;
import com.cmeeting.mapper.primary.AuthMapper; import com.cmeeting.mapper.primary.AuthMapper;
...@@ -88,13 +89,14 @@ public class UserServiceImpl implements UserService { ...@@ -88,13 +89,14 @@ public class UserServiceImpl implements UserService {
} }
@Override @Override
public String auth(UserVo.Auth vo) { public String auth(UserVo.Auth vo, String role) {
String userId = vo.getId(); String userId = vo.getId();
String nick = vo.getNick(); String nick = vo.getNick();
HashMap<String, String> stringStringHashMap = new HashMap<>(); HashMap<String, String> stringStringHashMap = new HashMap<>();
SysTenant sysTenant = iTenantService.getById(permissionTenantId); SysTenant sysTenant = iTenantService.getById(permissionTenantId);
stringStringHashMap.put("userId", userId); stringStringHashMap.put("userId", userId);
stringStringHashMap.put("tenantId", permissionTenantId); stringStringHashMap.put("tenantId", permissionTenantId);
stringStringHashMap.put("role", role);
stringStringHashMap.put("language", sysTenant.getLanguage()); stringStringHashMap.put("language", sysTenant.getLanguage());
stringStringHashMap.put("nick", nick); stringStringHashMap.put("nick", nick);
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userId, permissionTenantId); UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userId, permissionTenantId);
...@@ -225,7 +227,7 @@ public class UserServiceImpl implements UserService { ...@@ -225,7 +227,7 @@ public class UserServiceImpl implements UserService {
} }
UserVo.Auth authParams = UserVo.Auth.builder().id(userId).nick(robotSecurityUser.getNickName()).build(); 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; return token;
} }
......
package com.cmeeting.constant; package com.cmeeting.constant;
public interface RecordTemplateConstant { public interface RecordTemplateConstant {
/**
* 管理员
*/
String TEMPLATE_TYPE_SYSTEM = "system"; String TEMPLATE_TYPE_SYSTEM = "system";
/**
* 用户
*/
String TEMPLATE_TYPE_CUSTOM = "custom"; String TEMPLATE_TYPE_CUSTOM = "custom";
/** /**
......
...@@ -9,6 +9,7 @@ import com.cmeeting.service.ModulePermissionService; ...@@ -9,6 +9,7 @@ import com.cmeeting.service.ModulePermissionService;
import com.cmeeting.util.R; import com.cmeeting.util.R;
import com.cmeeting.vo.AuthVO; import com.cmeeting.vo.AuthVO;
import com.cmeeting.vo.PermissionVO; import com.cmeeting.vo.PermissionVO;
import org.jetbrains.annotations.NotNull;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -78,17 +79,17 @@ public class PermissionController { ...@@ -78,17 +79,17 @@ public class PermissionController {
* 用户自己取消使用生成纪要功能列表 * 用户自己取消使用生成纪要功能列表
* @return * @return
*/ */
@GetMapping("/personalCancelList") @GetMapping("/cancelList")
public R personalCancelList() { public R cancelList() {
return R.ok(modulePermissionService.personalCancelList()); return R.ok(modulePermissionService.personalCancelList());
} }
/** /**
* 用户自己取消使用生成纪要功能 * 用户自己取消使用生成纪要功能
*/ */
@GetMapping("/personalCancel") @GetMapping("/personalSwitch")
public R personalCancel() { public R personalSwitch(@Validated@NotNull Boolean enable) {
return R.ok(modulePermissionService.personalCancel(SecurityUtil.getUser().getUserId())); return R.ok(modulePermissionService.personalSwitch(SecurityUtil.getUser().getId(), enable));
} }
......
...@@ -24,5 +24,5 @@ public interface ModulePermissionService extends IService<ModulePermission> { ...@@ -24,5 +24,5 @@ public interface ModulePermissionService extends IService<ModulePermission> {
List<PermissionCheckedDTO.User> personalCancelList(); List<PermissionCheckedDTO.User> personalCancelList();
boolean personalCancel(String userId); Boolean personalSwitch(String userId, boolean enable);
} }
...@@ -171,7 +171,20 @@ public class ModulePermissionServiceImpl extends ServiceImpl<ModulePermissionMap ...@@ -171,7 +171,20 @@ public class ModulePermissionServiceImpl extends ServiceImpl<ModulePermissionMap
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean personalCancel(String userId) { 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>() this.remove(new LambdaQueryWrapper<ModulePermission>()
.eq(ModulePermission::getType, RecordTemplateConstant.REL_TYPE_USER) .eq(ModulePermission::getType, RecordTemplateConstant.REL_TYPE_USER)
.eq(ModulePermission::getPurpose, PermissionPruposeType.ADMIN_AUTH) .eq(ModulePermission::getPurpose, PermissionPruposeType.ADMIN_AUTH)
...@@ -179,10 +192,12 @@ public class ModulePermissionServiceImpl extends ServiceImpl<ModulePermissionMap ...@@ -179,10 +192,12 @@ public class ModulePermissionServiceImpl extends ServiceImpl<ModulePermissionMap
ModulePermission cancel = ModulePermission.builder() ModulePermission cancel = ModulePermission.builder()
.type(RecordTemplateConstant.REL_TYPE_USER) .type(RecordTemplateConstant.REL_TYPE_USER)
.purpose(PermissionPruposeType.PERSONAL_CLOSE) .purpose(PermissionPruposeType.PERSONAL_CLOSE)
.userType(UserTypeConstant.SYNC)
.relId(userId) .relId(userId)
.createTime(new Date()).build(); .createTime(new Date()).build();
return this.save(cancel); return this.save(cancel);
} }
}
} }
......
...@@ -149,10 +149,10 @@ permission: ...@@ -149,10 +149,10 @@ permission:
tenantId: ${PERMISSION_TENANT_ID} tenantId: ${PERMISSION_TENANT_ID}
admin-white_users: ${PERMISSION_ADMIN_WHITE_USERS} admin-white_users: ${PERMISSION_ADMIN_WHITE_USERS}
logging: #logging:
level: # level:
com.cmeeting.mapper.primary: TRACE # com.cmeeting.mapper.primary: INFO
com.cmeeting.mapper.secondary: TRACE # com.cmeeting.mapper.secondary: INFO
root: INFO # root: INFO
isDev: true isDev: true
\ No newline at end of file
<configuration> <?xml version="1.0" encoding="UTF-8"?>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <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> <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> </encoder>
</appender> </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> </root>
</configuration> </configuration>
package test;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.tencentcloudapi.wemeet.Client; import com.tencentcloudapi.wemeet.Client;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论