feat: Implement app backdoor login and user listing for mini-programs with corresponding tests

This commit is contained in:
2026-07-21 12:05:38 +08:00
parent e53dc7da4e
commit 9039effee4
4 changed files with 252 additions and 9 deletions

View File

@@ -2,9 +2,13 @@ package com.ruoyi.web.controller.system;
import java.util.Collections;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.AppUser;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.web.config.BackDoorLoginProperties;
import com.ruoyi.web.service.BackDoorLoginService;
import com.ruoyi.web.service.BackDoorLoginService.AppLoginSession;
import com.ruoyi.web.service.BackDoorLoginService.LoginSession;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -78,4 +82,24 @@ class BackDoorLoginControllerTest
assertFalse(response.getBody().contains("/management/"));
assertFalse(response.getBody().contains("?token=signed-token"));
}
@Test
void appBackDoorLoginReturnsSiteToken()
{
SysUser sysUser = new SysUser();
sysUser.setUserId(8L);
AppUser appUser = new AppUser();
appUser.setUserId(66L);
appUser.setIsCompanyUser("1");
when(loginService.loginApp(8L)).thenReturn(new AppLoginSession(sysUser, appUser, "site-token"));
JSONObject body = new JSONObject();
body.put("userId", 8L);
AjaxResult response = controller.appBackDoorLogin(body);
assertEquals(200, response.get("code"));
assertEquals("site-token", response.get("token"));
assertEquals(66L, response.get("appUserId"));
assertEquals("1", response.get("isCompanyUser"));
}
}

View File

@@ -3,6 +3,7 @@ package com.ruoyi.web.service;
import java.util.Collections;
import java.util.List;
import com.ruoyi.common.core.domain.entity.AppUser;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.exception.ServiceException;
@@ -10,6 +11,8 @@ import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.framework.web.service.UserDetailsServiceImpl;
import com.ruoyi.system.mapper.SysUserMapper;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.web.service.BackDoorLoginService.AppLoginSession;
import com.ruoyi.web.service.BackDoorLoginService.LoginSession;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -35,13 +38,15 @@ class BackDoorLoginServiceTest
private TokenService tokenService;
@Mock
private SysLoginService sysLoginService;
@Mock
private ISysUserService sysUserService;
private BackDoorLoginService service;
@BeforeEach
void setUp()
{
service = new BackDoorLoginService(userMapper, userDetailsService, tokenService, sysLoginService);
service = new BackDoorLoginService(userMapper, userDetailsService, tokenService, sysLoginService, sysUserService);
}
@Test
@@ -113,6 +118,41 @@ class BackDoorLoginServiceTest
verify(tokenService, never()).createTokenHourTwo(org.mockito.ArgumentMatchers.any());
}
@Test
void loginAppCreatesSiteTokenForLinkedAppUser()
{
SysUser user = activeUser(12L);
user.setAppUserId(66L);
AppUser appUser = new AppUser();
appUser.setUserId(66L);
appUser.setName("测试求职者");
when(userMapper.selectUserById(12L)).thenReturn(user);
when(userMapper.selectBackDoorEffectiveUserId("tester")).thenReturn(12L);
when(sysUserService.selectAppUserById(66L)).thenReturn(appUser);
when(sysLoginService.loginUserIdApp(appUser)).thenReturn("site-test-token");
AppLoginSession session = service.loginApp(12L);
assertSame(user, session.getSysUser());
assertSame(appUser, session.getAppUser());
assertEquals("site-test-token", session.getToken());
verify(sysLoginService).loginUserIdApp(appUser);
verify(tokenService, never()).createTokenHourTwo(org.mockito.ArgumentMatchers.any());
}
@Test
void loginAppRejectsUserWithoutAppUserLink()
{
SysUser user = activeUser(12L);
when(userMapper.selectUserById(12L)).thenReturn(user);
when(userMapper.selectBackDoorEffectiveUserId("tester")).thenReturn(12L);
ServiceException exception = assertThrows(ServiceException.class, () -> service.loginApp(12L));
assertEquals("该用户未关联小程序业务账号,不能授权登录", exception.getMessage());
verify(sysLoginService, never()).loginUserIdApp(org.mockito.ArgumentMatchers.any());
}
private SysUser activeUser(Long userId)
{
SysUser user = new SysUser();