Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -312,10 +312,16 @@ public enum ExceptionEnum implements IBaseError {
* Cm 337 exception enum.
*/
CM337("CM337", "组织不存在"),

/**
* Cm 338 exception enum.
*/
CM338("CM338", "用户不存在,请重新注册");
CM338("CM338", "用户不存在,请重新注册"),

/**
* Cm 339 exception enum.
*/
CM339("CM339", "token检验失败,请重新登录");

/**
* 错误码
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

package com.tinyengine.it.login.config;

import com.tinyengine.it.common.exception.ExceptionEnum;
import com.tinyengine.it.common.exception.ServiceException;
import com.tinyengine.it.login.utils.JwtUtil;
import com.tinyengine.it.login.config.context.DefaultLoginUserContext;
import com.tinyengine.it.login.model.UserInfo;
Expand All @@ -35,18 +37,15 @@ public class SSOInterceptor implements HandlerInterceptor {
@Autowired
private JwtUtil jwtUtil;

private static final String SSO_SERVER = System.getenv("SSO_SERVER");

@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {

String authorization = request.getHeader("Authorization");
// 如果没有token,重定向到登录页
if (authorization == null || authorization.isEmpty()) {
log.info("No token, redirecting to: {}", SSO_SERVER);
response.sendRedirect(SSO_SERVER);
return false;
log.info("No token");
throw new ServiceException(ExceptionEnum.CM336.getResultCode(), ExceptionEnum.CM336.getResultMsg());
}
String token = jwtUtil.getTokenFromRequest(authorization);
String requestURI = request.getRequestURI();
Expand All @@ -57,8 +56,7 @@ public boolean preHandle(HttpServletRequest request,
// 验证token
if (!jwtUtil.validateToken(token)) {
log.warn("Token validation failed");
response.sendRedirect(SSO_SERVER);
return false;
throw new ServiceException(ExceptionEnum.CM339.getResultCode(), ExceptionEnum.CM339.getResultMsg());
}

// 从token中获取用户信息
Expand All @@ -72,8 +70,7 @@ public boolean preHandle(HttpServletRequest request,
// 检查必需的用户信息
if (username == null || username.isEmpty() || userId == null) {
log.warn("User information is incomplete - username: {}, userId: {}", username, userId);
response.sendRedirect(SSO_SERVER);
return false;
throw new ServiceException(ExceptionEnum.CM339.getResultCode(), ExceptionEnum.CM339.getResultMsg());
}

// 存储用户信息到LoginUserContext
Expand All @@ -90,9 +87,8 @@ public boolean preHandle(HttpServletRequest request,

} catch (Exception e) {
log.error("Token validation exception: {}", e.getMessage(), e);
response.sendRedirect(SSO_SERVER);
DefaultLoginUserContext.clear();
return false;
throw new ServiceException(ExceptionEnum.CM339.getResultCode(), ExceptionEnum.CM339.getResultMsg());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,13 @@ public String getTenantId() {
if (tenantList == null || tenantList.isEmpty()) {
return DEFAULT_TENANT;
}
for (Tenant tenant : tenantList) {
if (tenant.getIsInUse()) {
return tenant.getId();
}
}

return tenantList.get(0).getId();
return DEFAULT_TENANT;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,18 +239,29 @@ public Result<ValidationResult> validateToken(@RequestParam String token) {
@GetMapping("/user/tenant")
public Result<SSOTicket> setTenant(@RequestParam Integer tenantId) {
List<Tenant> tenants = loginUserContext.getTenants();
if (tenantId == null) {
return Result.failed(ExceptionEnum.CM320);
}
if (tenants == null || tenants.isEmpty()) {
return Result.failed(ExceptionEnum.CM337);
}
List<Tenant> currentTenant = new ArrayList<>();
List<Tenant> tenantList = new ArrayList<>();
boolean found = false;
for (Tenant tenant : tenants) {
if (tenant.getId().equals(tenantId.toString())) {
currentTenant.add(tenant);
tenant.setIsInUse(true);
found = true;
} else {
tenant.setIsInUse(false);
}

tenantList.add(tenant);
}
if (currentTenant.isEmpty()) {

if (!found) {
return Result.failed(ExceptionEnum.CM337);
}

// 通过 RequestContextHolder 获取请求
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();
Expand All @@ -259,7 +270,7 @@ public Result<SSOTicket> setTenant(@RequestParam Integer tenantId) {
if (headerToken == null || headerToken.isEmpty()) {
return Result.failed(ExceptionEnum.CM336);
}
String token = jwtUtil.generateTokenWithSelectedTenant(headerToken, currentTenant);
String token = jwtUtil.generateTokenWithSelectedTenant(headerToken, tenantList);
// 将原 token 加入黑名单
Claims claims = Jwts.parser()
.verifyWith(JwtUtil.getSecretKey())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package com.tinyengine.it.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tinyengine.it.model.entity.AuthUsersUnitsRoles;
import com.tinyengine.it.model.entity.Tenant;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface AuthUsersUnitsRolesMapper {
public interface AuthUsersUnitsRolesMapper extends BaseMapper<AuthUsersUnitsRoles> {
/**
* 查询表r_auth_users_units_roles所有信息
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public class Tenant {
@TableId(value = "id", type = IdType.AUTO)
private String id;

@Schema(name = "nameCn", description = "组织唯一代码")
@Schema(name = "orgCode", description = "组织唯一代码")
private String orgCode;

@Schema(name = "nameCn", description = "组织中文名")
Expand All @@ -54,6 +54,10 @@ public class Tenant {
@Schema(name = "description", description = "组织描述")
private String description;

@TableField(exist = false)
@Schema(name = "isInUse", description = "是否当前所在组织")
private Boolean isInUse;

@TableField(fill = FieldFill.INSERT)
@Schema(name = "createdTime", description = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,11 @@

package com.tinyengine.it.service.platform.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tinyengine.it.common.context.LoginUserContext;
import com.tinyengine.it.common.exception.ExceptionEnum;
import com.tinyengine.it.common.exception.ServiceException;
import com.tinyengine.it.mapper.TenantMapper;
import com.tinyengine.it.mapper.AuthUsersUnitsRolesMapper;
import com.tinyengine.it.model.entity.AuthUsersUnitsRoles;
Expand Down Expand Up @@ -110,6 +113,12 @@ public Integer updateTenantById(Tenant tenant) {
*/
@Override
public Integer createTenant(Tenant tenant) {
QueryWrapper<Tenant> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name_cn", tenant.getNameCn());
Tenant tenantResult = this.baseMapper.selectOne(queryWrapper);
if (tenantResult != null) {
throw new ServiceException(ExceptionEnum.CM003.getResultCode(), ExceptionEnum.CM003.getResultMsg());
}
int result = baseMapper.createTenant(tenant);
if (result == 1) {
AuthUsersUnitsRoles authUsersUnitsRoles = new AuthUsersUnitsRoles();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,16 @@
* @since 2025-04-14
*/
public class MockUserContext implements LoginUserContext {
/**
* 返回当前用户所在的业务租户id
*
* @return 租户Id
*/
@Override
public String getTenantId() {
return "1";
}

/**
* 返回当前用户所诉的业务租户信息
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ void testInsertFill() throws NoSuchFieldException, IllegalAccessException {
when(param.hasSetter("tenantId")).thenReturn(true);
TestUtil.setPrivateValue(myMetaObjectHandler, "loginUserContext", new MockUserContext());
myMetaObjectHandler.insertFill(param);
verify(param, times(6)).hasSetter(anyString());
verify(param, times(5)).hasSetter(anyString());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,16 @@

package com.tinyengine.it.controller;

import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;

import com.tinyengine.it.common.base.Result;
import com.tinyengine.it.common.context.LoginUserContext;
import com.tinyengine.it.common.handler.MockUserContext;
import com.tinyengine.it.common.utils.TestUtil;
import com.tinyengine.it.mapper.AuthUsersUnitsRolesMapper;
import com.tinyengine.it.model.entity.Tenant;
import com.tinyengine.it.model.entity.User;
import com.tinyengine.it.service.app.UserService;

Expand All @@ -29,6 +32,9 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.ArrayList;
import java.util.List;

/**
* test case
*
Expand All @@ -42,7 +48,7 @@ class UserControllerTest {
private UserController userController;

@Mock
private LoginUserContext loginUserContext = new MockUserContext();
private AuthUsersUnitsRolesMapper authUsersUnitsRolesMapper;

@BeforeEach
void setUp() throws NoSuchFieldException, IllegalAccessException {
Expand All @@ -53,7 +59,11 @@ void setUp() throws NoSuchFieldException, IllegalAccessException {
void testMe() throws NoSuchFieldException, IllegalAccessException {
TestUtil.setPrivateValue(userController, "loginUserContext", new MockUserContext());
User mockData = new User();
Tenant tenant = new Tenant();
List<Tenant> tenants = new ArrayList<>();
tenants.add(tenant);
when(userService.queryUserById(anyString())).thenReturn(mockData);
when(authUsersUnitsRolesMapper.queryAllTenantByUserId(anyInt())).thenReturn(tenants);
Result<User> result = userController.me();
Assertions.assertEquals(mockData, result.getData());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import cn.hutool.core.util.ReflectUtil;
import com.tinyengine.it.common.base.Result;
import com.tinyengine.it.common.context.LoginUserContext;
import com.tinyengine.it.common.handler.MockUserContext;
import com.tinyengine.it.common.utils.TestUtil;
import com.tinyengine.it.mapper.AppMapper;
import com.tinyengine.it.mapper.I18nEntryMapper;
import com.tinyengine.it.model.dto.I18nEntryDto;
Expand Down Expand Up @@ -65,20 +67,17 @@ class AppServiceImplTest {
@InjectMocks
private AppServiceImpl appServiceImpl;

@Mock
LoginUserContext loginUserContext;

private String TENANTID = loginUserContext.getTenantId();
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
ReflectUtil.setFieldValue(appServiceImpl, "baseMapper", appMapper);
ReflectUtil.setFieldValue(appServiceImpl, "loginUserContext", new MockUserContext());
}

@Test
void testQueryAllApp() {
List<App> mockData = Arrays.<App>asList(new App());
when(appMapper.queryAllApp(TENANTID)).thenReturn(mockData);
when(appMapper.queryAllApp("1")).thenReturn(mockData);

List<App> result = appServiceImpl.queryAllApp();
Assertions.assertEquals(mockData, result);
Expand All @@ -87,7 +86,7 @@ void testQueryAllApp() {
@Test
void testQueryAppById() {
App app = new App();
when(appMapper.queryAppById(1, TENANTID)).thenReturn(app);
when(appMapper.queryAppById(1, "1")).thenReturn(app);

Result<App> result = appServiceImpl.queryAppById(1);
Assertions.assertEquals(app, result.getData());
Expand All @@ -105,8 +104,8 @@ void testQueryAppByCondition() {
@Test
void testDeleteAppById() {
App app = new App();
when(appMapper.queryAppById(1, TENANTID)).thenReturn(app);
when(appMapper.deleteAppById(1, TENANTID)).thenReturn(2);
when(appMapper.queryAppById(1, "1")).thenReturn(app);
when(appMapper.deleteAppById(1, "1")).thenReturn(2);

Result<App> result = appServiceImpl.deleteAppById(1);
Assertions.assertEquals(app, result.getData());
Expand All @@ -120,7 +119,7 @@ void testUpdateAppById() {

resultApp.setExtendConfig(mockConfig);
int appId = 1;
when(appMapper.queryAppById(appId, TENANTID)).thenReturn(resultApp);
when(appMapper.queryAppById(appId, "1")).thenReturn(resultApp);
App param = new App();
param.setId(appId);

Expand All @@ -139,6 +138,7 @@ void testUpdateAppById() {
void testCreateApp() {
List<App> appResult = new ArrayList<>();
App param = new App();
param.setTenantId("1");
when(appMapper.queryAppByCondition(param)).thenReturn(appResult);
when(appMapper.createApp(param)).thenReturn(1);

Expand Down
Loading
Loading