refactor: 把登录逻辑移到admin 因为不同项目的登录 可能是不一样的

This commit is contained in:
valarchie
2023-07-30 13:32:25 +08:00
parent fcb88e5a94
commit 6f96216248
41 changed files with 278 additions and 244 deletions

View File

@@ -18,7 +18,7 @@ import com.agileboot.infrastructure.security.AuthenticationUtils;
import com.agileboot.admin.customize.service.login.dto.CaptchaDTO;
import com.agileboot.admin.customize.service.login.dto.ConfigDTO;
import com.agileboot.admin.customize.service.login.command.LoginCommand;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.infrastructure.annotations.ratelimit.RateLimitKey;
import com.agileboot.admin.customize.service.login.LoginService;
import io.swagger.v3.oas.annotations.Operation;
@@ -100,7 +100,7 @@ public class LoginController {
public ResponseDTO<TokenDTO> login(@RequestBody LoginCommand loginCommand) {
// 生成令牌
String token = loginService.login(loginCommand);
LoginUser loginUser = AuthenticationUtils.getLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getLoginUser();
CurrentLoginUserDTO currentUserDTO = userApplicationService.getLoginUserInfo(loginUser);
return ResponseDTO.ok(new TokenDTO(token, currentUserDTO));
@@ -114,7 +114,7 @@ public class LoginController {
@Operation(summary = "获取当前登录用户信息")
@GetMapping("/getLoginUserInfo")
public ResponseDTO<CurrentLoginUserDTO> getLoginUserInfo() {
LoginUser loginUser = AuthenticationUtils.getLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getLoginUser();
CurrentLoginUserDTO currentUserDTO = userApplicationService.getLoginUserInfo(loginUser);
@@ -129,7 +129,7 @@ public class LoginController {
@Operation(summary = "获取用户对应的菜单路由", description = "用于动态生成路由")
@GetMapping("/getRouters")
public ResponseDTO<List<RouterDTO>> getRouters() {
LoginUser loginUser = AuthenticationUtils.getLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getLoginUser();
List<RouterDTO> routerTree = menuApplicationService.getRouterTree(loginUser);
return ResponseDTO.ok(routerTree);
}

View File

@@ -11,7 +11,7 @@ import com.agileboot.domain.system.menu.dto.MenuDetailDTO;
import com.agileboot.domain.system.menu.query.MenuQuery;
import com.agileboot.infrastructure.annotations.accessLog.AccessLog;
import com.agileboot.infrastructure.security.AuthenticationUtils;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.orm.common.enums.BusinessTypeEnum;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -74,7 +74,7 @@ public class SysMenuController extends BaseController {
@Operation(summary = "菜单列表(树级)", description = "菜单树级下拉框")
@GetMapping("/dropdown")
public ResponseDTO<List<Tree<Long>>> dropdownList() {
LoginUser loginUser = AuthenticationUtils.getLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getLoginUser();
List<Tree<Long>> dropdownList = menuApplicationService.getDropdownList(loginUser);
return ResponseDTO.ok(dropdownList);
}

View File

@@ -14,7 +14,7 @@ import com.agileboot.domain.system.user.command.UpdateUserPasswordCommand;
import com.agileboot.domain.system.user.dto.UserProfileDTO;
import com.agileboot.infrastructure.annotations.accessLog.AccessLog;
import com.agileboot.infrastructure.security.AuthenticationUtils;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.orm.common.enums.BusinessTypeEnum;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -49,7 +49,7 @@ public class SysProfileController extends BaseController {
@Operation(summary = "获取个人信息")
@GetMapping
public ResponseDTO<UserProfileDTO> profile() {
LoginUser user = AuthenticationUtils.getLoginUser();
WebLoginUser user = AuthenticationUtils.getLoginUser();
UserProfileDTO userProfile = userApplicationService.getUserProfile(user.getUserId());
return ResponseDTO.ok(userProfile);
}
@@ -61,7 +61,7 @@ public class SysProfileController extends BaseController {
@AccessLog(title = "个人信息", businessType = BusinessTypeEnum.MODIFY)
@PutMapping
public ResponseDTO<Void> updateProfile(@RequestBody UpdateProfileCommand command) {
LoginUser loginUser = AuthenticationUtils.getLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getLoginUser();
command.setUserId(loginUser.getUserId());
userApplicationService.updateUserProfile(command);
return ResponseDTO.ok();
@@ -74,7 +74,7 @@ public class SysProfileController extends BaseController {
@AccessLog(title = "个人信息", businessType = BusinessTypeEnum.MODIFY)
@PutMapping("/password")
public ResponseDTO<Void> updatePassword(@RequestBody UpdateUserPasswordCommand command) {
LoginUser loginUser = AuthenticationUtils.getLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getLoginUser();
command.setUserId(loginUser.getUserId());
userApplicationService.updatePasswordBySelf(loginUser, command);
return ResponseDTO.ok();
@@ -90,7 +90,7 @@ public class SysProfileController extends BaseController {
if (file.isEmpty()) {
throw new ApiException(ErrorCode.Business.USER_UPLOAD_FILE_FAILED);
}
LoginUser loginUser = AuthenticationUtils.getLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getLoginUser();
String avatarUrl = FileUploadUtils.upload(UploadSubDir.AVATAR_PATH, file);
userApplicationService.updateUserAvatar(new UpdateUserAvatarCommand(loginUser.getUserId(), avatarUrl));

View File

@@ -16,7 +16,7 @@ import com.agileboot.domain.system.user.dto.UserDetailDTO;
import com.agileboot.domain.system.user.query.SearchUserQuery;
import com.agileboot.infrastructure.annotations.accessLog.AccessLog;
import com.agileboot.infrastructure.security.AuthenticationUtils;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.orm.common.enums.BusinessTypeEnum;
import com.agileboot.orm.system.result.SearchUserDO;
import io.swagger.v3.oas.annotations.Operation;
@@ -136,7 +136,7 @@ public class SysUserController extends BaseController {
@DeleteMapping("/{userIds}")
public ResponseDTO<Void> remove(@PathVariable List<Long> userIds) {
BulkOperationCommand<Long> bulkDeleteCommand = new BulkOperationCommand<>(userIds);
LoginUser loginUser = AuthenticationUtils.getLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getLoginUser();
userApplicationService.deleteUsers(loginUser, bulkDeleteCommand);
return ResponseDTO.ok();
}

View File

@@ -1,8 +1,8 @@
package com.agileboot.admin.customize.config;
import com.agileboot.infrastructure.security.AuthenticationUtils;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.service.TokenService;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.admin.customize.service.login.TokenService;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
@@ -33,7 +33,7 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
LoginUser loginUser = tokenService.getLoginUser(request);
WebLoginUser loginUser = tokenService.getLoginUser(request);
if (loginUser != null && AuthenticationUtils.getAuthentication() == null) {
tokenService.refreshToken(loginUser);
// 如果没有将当前登录用户放入到上下文中的话,会认定用户未授权,返回用户未登陆的错误
@@ -45,7 +45,7 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
}
private void putCurrentLoginUserIntoContext(HttpServletRequest request, LoginUser loginUser) {
private void putCurrentLoginUserIntoContext(HttpServletRequest request, WebLoginUser loginUser) {
UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(loginUser,
null, loginUser.getAuthorities());
authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));

View File

@@ -9,9 +9,8 @@ import com.agileboot.common.utils.ServletHolderUtil;
import com.agileboot.infrastructure.cache.redis.RedisCacheService;
import com.agileboot.infrastructure.thread.AsyncTaskFactory;
import com.agileboot.infrastructure.thread.ThreadPoolManager;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.service.TokenService;
import com.agileboot.infrastructure.web.service.UserDetailsServiceImpl;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.admin.customize.service.login.TokenService;
import com.agileboot.orm.common.enums.LoginStatusEnum;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@@ -92,7 +91,7 @@ public class SecurityConfig {
@Bean
public LogoutSuccessHandler logOutSuccessHandler() {
return (request, response, authentication) -> {
LoginUser loginUser = tokenService.getLoginUser(request);
WebLoginUser loginUser = tokenService.getLoginUser(request);
if (loginUser != null) {
String userName = loginUser.getUsername();
// 删除用户缓存记录

View File

@@ -25,8 +25,7 @@ import com.agileboot.infrastructure.thread.ThreadPoolManager;
import com.agileboot.admin.customize.service.login.dto.CaptchaDTO;
import com.agileboot.admin.customize.service.login.dto.ConfigDTO;
import com.agileboot.admin.customize.service.login.command.LoginCommand;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.service.TokenService;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.orm.common.enums.ConfigKeyEnum;
import com.agileboot.orm.common.enums.LoginStatusEnum;
import com.agileboot.orm.system.entity.SysUserEntity;
@@ -105,7 +104,7 @@ public class LoginService {
// 把当前登录用户 放入上下文中
SecurityContextHolder.getContext().setAuthentication(authentication);
// 这里获取的loginUser是UserDetailsServiceImpl#loadUserByUsername方法返回的LoginUser
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
WebLoginUser loginUser = (WebLoginUser) authentication.getPrincipal();
recordLoginInfo(loginUser);
// 生成token
return tokenService.createTokenAndPutUserInCache(loginUser);
@@ -203,7 +202,7 @@ public class LoginService {
* 记录登录信息
* @param loginUser 登录用户
*/
public void recordLoginInfo(LoginUser loginUser) {
public void recordLoginInfo(WebLoginUser loginUser) {
ThreadPoolManager.execute(AsyncTaskFactory.loginInfoTask(loginUser.getUsername(), LoginStatusEnum.LOGIN_SUCCESS,
LoginStatusEnum.LOGIN_SUCCESS.description()));

View File

@@ -1,4 +1,4 @@
package com.agileboot.infrastructure.web.service;
package com.agileboot.admin.customize.service.login;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.IdUtil;
@@ -7,7 +7,7 @@ import com.agileboot.common.constant.Constants.Token;
import com.agileboot.common.exception.ApiException;
import com.agileboot.common.exception.error.ErrorCode;
import com.agileboot.infrastructure.cache.redis.RedisCacheService;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MalformedJwtException;
@@ -63,7 +63,7 @@ public class TokenService {
*
* @return 用户信息
*/
public LoginUser getLoginUser(HttpServletRequest request) {
public WebLoginUser getLoginUser(HttpServletRequest request) {
// 获取请求携带的令牌
String token = getTokenFromRequest(request);
if (StrUtil.isNotEmpty(token)) {
@@ -91,7 +91,7 @@ public class TokenService {
* @param loginUser 用户信息
* @return 令牌
*/
public String createTokenAndPutUserInCache(LoginUser loginUser) {
public String createTokenAndPutUserInCache(WebLoginUser loginUser) {
loginUser.setCachedKey(IdUtil.fastUUID());
redisCache.loginUserCache.set(loginUser.getCachedKey(), loginUser);
@@ -103,7 +103,7 @@ public class TokenService {
* 当超过20分钟自动刷新token
* @param loginUser 登录用户
*/
public void refreshToken(LoginUser loginUser) {
public void refreshToken(WebLoginUser loginUser) {
long currentTime = System.currentTimeMillis();
if (currentTime > loginUser.getAutoRefreshCacheTime()) {
loginUser.setAutoRefreshCacheTime(currentTime + TimeUnit.MINUTES.toMillis(autoRefreshTime));

View File

@@ -1,10 +1,10 @@
package com.agileboot.infrastructure.web.service;
package com.agileboot.admin.customize.service.login;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.agileboot.common.exception.ApiException;
import com.agileboot.common.exception.error.ErrorCode;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.infrastructure.web.domain.login.RoleInfo;
import com.agileboot.orm.common.enums.DataScopeEnum;
import com.agileboot.orm.common.enums.UserStatusEnum;
@@ -35,6 +35,7 @@ import org.springframework.stereotype.Service;
/**
* 自定义加载用户信息通过用户名
* 用于SpringSecurity 登录流程
* 没有办法把这个类 放进loginService中 会在SecurityConfig中造成循环依赖
* @see com.agileboot.infrastructure.config.SecurityConfig#filterChain(HttpSecurity)
* @author valarchie
*/
@@ -67,20 +68,23 @@ public class UserDetailsServiceImpl implements UserDetailsService {
log.info("登录用户:{} 已被停用.", username);
throw new ApiException(ErrorCode.Business.USER_IS_DISABLE, username);
}
LoginUser loginUser = new LoginUser(userEntity.getUserId(), userEntity.getIsAdmin(), userEntity.getUsername(),
userEntity.getPassword());
loginUser.setLoginTime(System.currentTimeMillis());
loginUser.setAutoRefreshCacheTime(loginUser.getLoginTime() + TimeUnit.MINUTES.toMillis(tokenService.getAutoRefreshTime()));
loginUser.fillUserAgent();
RoleInfo roleInfo = getRoleInfo(userEntity.getRoleId(), userEntity.getIsAdmin());
WebLoginUser loginUser = new WebLoginUser(userEntity.getUserId(), userEntity.getIsAdmin(), userEntity.getUsername(),
userEntity.getPassword(), roleInfo, userEntity.getDeptId());
loginUser.fillLoginInfo();
loginUser.setAutoRefreshCacheTime(loginUser.getLoginInfo().getLoginTime()
+ TimeUnit.MINUTES.toMillis(tokenService.getAutoRefreshTime()));
return loginUser;
}
public RoleInfo getRoleInfo(Long roleId) {
public RoleInfo getRoleInfo(Long roleId, boolean isAdmin) {
if (roleId == null) {
return RoleInfo.EMPTY_ROLE;
}
if (roleId == RoleInfo.ADMIN_ROLE_ID) {
if (isAdmin) {
LambdaQueryWrapper<SysMenuEntity> menuQuery = Wrappers.lambdaQuery();
menuQuery.select(SysMenuEntity::getMenuId);
List<SysMenuEntity> allMenus = menuService.list(menuQuery);
@@ -115,5 +119,4 @@ public class UserDetailsServiceImpl implements UserDetailsService {
}
}

View File

@@ -1,13 +1,14 @@
package com.agileboot.infrastructure.web.domain.permission;
package com.agileboot.admin.customize.service.permission;
import cn.hutool.extra.spring.SpringUtil;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.permission.checker.AllDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.permission.checker.CustomDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.permission.checker.DefaultDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.permission.checker.DeptTreeDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.permission.checker.OnlySelfDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.permission.checker.SingleDeptDataPermissionChecker;
import com.agileboot.admin.customize.service.permission.model.AbstractDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.admin.customize.service.permission.model.checker.AllDataPermissionChecker;
import com.agileboot.admin.customize.service.permission.model.checker.CustomDataPermissionChecker;
import com.agileboot.admin.customize.service.permission.model.checker.DefaultDataPermissionChecker;
import com.agileboot.admin.customize.service.permission.model.checker.DeptTreeDataPermissionChecker;
import com.agileboot.admin.customize.service.permission.model.checker.OnlySelfDataPermissionChecker;
import com.agileboot.admin.customize.service.permission.model.checker.SingleDeptDataPermissionChecker;
import com.agileboot.orm.common.enums.DataScopeEnum;
import com.agileboot.orm.system.service.ISysDeptService;
import javax.annotation.PostConstruct;
@@ -40,7 +41,7 @@ public class DataPermissionCheckerFactory {
}
public static AbstractDataPermissionChecker getChecker(LoginUser loginUser) {
public static AbstractDataPermissionChecker getChecker(WebLoginUser loginUser) {
if (loginUser == null) {
return deptTreeChecker;
}

View File

@@ -1,11 +1,10 @@
package com.agileboot.infrastructure.web.service;
package com.agileboot.admin.customize.service.permission;
import cn.hutool.core.collection.CollUtil;
import com.agileboot.admin.customize.service.permission.model.AbstractDataPermissionChecker;
import com.agileboot.admin.customize.service.permission.model.DataCondition;
import com.agileboot.infrastructure.security.AuthenticationUtils;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.permission.AbstractDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.permission.DataCondition;
import com.agileboot.infrastructure.web.domain.permission.DataPermissionCheckerFactory;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.orm.system.entity.SysUserEntity;
import com.agileboot.orm.system.service.ISysUserService;
import java.util.List;
@@ -31,7 +30,7 @@ public class DataPermissionService {
* @return 检验结果
*/
public boolean checkUserId(Long userId) {
LoginUser loginUser = AuthenticationUtils.getLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getLoginUser();
SysUserEntity targetUser = userService.getById(userId);
if (targetUser == null) {
return true;
@@ -57,12 +56,12 @@ public class DataPermissionService {
}
public boolean checkDeptId(Long deptId) {
LoginUser loginUser = AuthenticationUtils.getLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getLoginUser();
return checkDataScope(loginUser, deptId, null);
}
public boolean checkDataScope(LoginUser loginUser, Long targetDeptId, Long targetUserId) {
public boolean checkDataScope(WebLoginUser loginUser, Long targetDeptId, Long targetUserId) {
DataCondition dataCondition = DataCondition.builder().targetDeptId(targetDeptId).targetUserId(targetUserId).build();
AbstractDataPermissionChecker checker = DataPermissionCheckerFactory.getChecker(loginUser);
return checker.check(loginUser, dataCondition);

View File

@@ -1,9 +1,9 @@
package com.agileboot.infrastructure.web.service;
package com.agileboot.admin.customize.service.permission;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.agileboot.infrastructure.security.AuthenticationUtils;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.infrastructure.web.domain.login.RoleInfo;
import java.util.Set;
import org.springframework.stereotype.Service;
@@ -26,7 +26,7 @@ public class MenuPermissionService {
if (StrUtil.isEmpty(permission)) {
return false;
}
LoginUser loginUser = AuthenticationUtils.getLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getLoginUser();
if (loginUser == null || CollUtil.isEmpty(loginUser.getRoleInfo().getMenuPermissions())) {
return false;
}

View File

@@ -1,6 +1,6 @@
package com.agileboot.infrastructure.web.domain.permission;
package com.agileboot.admin.customize.service.permission.model;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.orm.system.service.ISysDeptService;
import lombok.Data;
@@ -20,6 +20,6 @@ public abstract class AbstractDataPermissionChecker {
* @param condition 条件
* @return 校验结果
*/
public abstract boolean check(LoginUser loginUser, DataCondition condition);
public abstract boolean check(WebLoginUser loginUser, DataCondition condition);
}

View File

@@ -1,4 +1,4 @@
package com.agileboot.infrastructure.web.domain.permission;
package com.agileboot.admin.customize.service.permission.model;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@@ -0,0 +1,25 @@
package com.agileboot.admin.customize.service.permission.model.checker;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.admin.customize.service.permission.model.AbstractDataPermissionChecker;
import com.agileboot.admin.customize.service.permission.model.DataCondition;
import com.agileboot.orm.system.service.ISysDeptService;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 数据权限测试接口
* @author valarchie
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class AllDataPermissionChecker extends AbstractDataPermissionChecker {
private ISysDeptService deptService;
@Override
public boolean check(WebLoginUser loginUser, DataCondition condition) {
return true;
}
}

View File

@@ -1,9 +1,9 @@
package com.agileboot.infrastructure.web.domain.permission.checker;
package com.agileboot.admin.customize.service.permission.model.checker;
import cn.hutool.core.collection.CollUtil;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.permission.AbstractDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.permission.DataCondition;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.admin.customize.service.permission.model.AbstractDataPermissionChecker;
import com.agileboot.admin.customize.service.permission.model.DataCondition;
import com.agileboot.orm.system.service.ISysDeptService;
import java.util.Set;
import lombok.AllArgsConstructor;
@@ -25,7 +25,7 @@ public class CustomDataPermissionChecker extends AbstractDataPermissionChecker {
@Override
public boolean check(LoginUser loginUser, DataCondition condition) {
public boolean check(WebLoginUser loginUser, DataCondition condition) {
if (condition == null || loginUser == null) {
return false;
}

View File

@@ -0,0 +1,25 @@
package com.agileboot.admin.customize.service.permission.model.checker;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.admin.customize.service.permission.model.AbstractDataPermissionChecker;
import com.agileboot.admin.customize.service.permission.model.DataCondition;
import com.agileboot.orm.system.service.ISysDeptService;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 数据权限测试接口
* @author valarchie
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class DefaultDataPermissionChecker extends AbstractDataPermissionChecker {
private ISysDeptService deptService;
@Override
public boolean check(WebLoginUser loginUser, DataCondition condition) {
return false;
}
}

View File

@@ -1,8 +1,8 @@
package com.agileboot.infrastructure.web.domain.permission.checker;
package com.agileboot.admin.customize.service.permission.model.checker;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.permission.AbstractDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.permission.DataCondition;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.admin.customize.service.permission.model.AbstractDataPermissionChecker;
import com.agileboot.admin.customize.service.permission.model.DataCondition;
import com.agileboot.orm.system.service.ISysDeptService;
import java.util.Objects;
import lombok.AllArgsConstructor;
@@ -23,7 +23,7 @@ public class DeptTreeDataPermissionChecker extends AbstractDataPermissionChecker
private ISysDeptService deptService;
@Override
public boolean check(LoginUser loginUser, DataCondition condition) {
public boolean check(WebLoginUser loginUser, DataCondition condition) {
if (condition == null || loginUser == null) {
return false;
}

View File

@@ -1,8 +1,8 @@
package com.agileboot.infrastructure.web.domain.permission.checker;
package com.agileboot.admin.customize.service.permission.model.checker;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.permission.AbstractDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.permission.DataCondition;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.admin.customize.service.permission.model.AbstractDataPermissionChecker;
import com.agileboot.admin.customize.service.permission.model.DataCondition;
import com.agileboot.orm.system.service.ISysDeptService;
import java.util.Objects;
import lombok.AllArgsConstructor;
@@ -23,7 +23,7 @@ public class OnlySelfDataPermissionChecker extends AbstractDataPermissionChecker
private ISysDeptService deptService;
@Override
public boolean check(LoginUser loginUser, DataCondition condition) {
public boolean check(WebLoginUser loginUser, DataCondition condition) {
if (condition == null || loginUser == null) {
return false;
}

View File

@@ -1,8 +1,8 @@
package com.agileboot.infrastructure.web.domain.permission.checker;
package com.agileboot.admin.customize.service.permission.model.checker;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.permission.AbstractDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.permission.DataCondition;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.admin.customize.service.permission.model.AbstractDataPermissionChecker;
import com.agileboot.admin.customize.service.permission.model.DataCondition;
import com.agileboot.orm.system.service.ISysDeptService;
import java.util.Objects;
import lombok.AllArgsConstructor;
@@ -23,7 +23,7 @@ public class SingleDeptDataPermissionChecker extends AbstractDataPermissionCheck
private ISysDeptService deptService;
@Override
public boolean check(LoginUser loginUser, DataCondition condition) {
public boolean check(WebLoginUser loginUser, DataCondition condition) {
if (condition == null || loginUser == null) {
return false;
}

View File

@@ -1,13 +1,14 @@
package com.agileboot.infrastructure.web.domain.permission.checker;
package com.agileboot.admin.customize.service.permission;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.admin.customize.service.permission.model.checker.CustomDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.infrastructure.web.domain.login.RoleInfo;
import com.agileboot.infrastructure.web.domain.permission.DataCondition;
import com.agileboot.admin.customize.service.permission.model.DataCondition;
import com.agileboot.orm.system.service.ISysDeptService;
import org.apache.commons.collections4.SetUtils;
import org.junit.jupiter.api.BeforeEach;
@@ -16,7 +17,7 @@ import org.junit.jupiter.api.Test;
class CustomDataPermissionCheckerTest {
private final ISysDeptService deptService = mock(ISysDeptService.class);
public LoginUser loginUser = mock(LoginUser.class);
public WebLoginUser loginUser = mock(WebLoginUser.class);
@BeforeEach
public void mockBefore() {

View File

@@ -1,4 +1,4 @@
package com.agileboot.infrastructure.web.domain.permission.checker;
package com.agileboot.admin.customize.service.permission;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -6,9 +6,10 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.admin.customize.service.permission.model.checker.DeptTreeDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.infrastructure.web.domain.login.RoleInfo;
import com.agileboot.infrastructure.web.domain.permission.DataCondition;
import com.agileboot.admin.customize.service.permission.model.DataCondition;
import com.agileboot.orm.system.service.ISysDeptService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -18,7 +19,7 @@ class DeptTreeDataPermissionCheckerTest {
private final ISysDeptService deptService = mock(ISysDeptService.class);
public LoginUser loginUser = mock(LoginUser.class);
public WebLoginUser loginUser = mock(WebLoginUser.class);
@BeforeEach
public void mockBefore() {
@@ -30,7 +31,7 @@ class DeptTreeDataPermissionCheckerTest {
DeptTreeDataPermissionChecker checker = new DeptTreeDataPermissionChecker(deptService);
boolean check1 = checker.check(null, null);
boolean check2 = checker.check(new LoginUser(), null);
boolean check2 = checker.check(new WebLoginUser(), null);
boolean check3 = checker.check(null, new DataCondition());
boolean check4 = checker.check(loginUser, new DataCondition());
@@ -61,7 +62,7 @@ class DeptTreeDataPermissionCheckerTest {
void testCheckWhenIsSameDept() {
DeptTreeDataPermissionChecker checker = new DeptTreeDataPermissionChecker(deptService);
Mockito.when(deptService.isChildOfTheDept(any(), any())).thenReturn(false);
when(deptService.isChildOfTheDept(any(), any())).thenReturn(false);
when(loginUser.getDeptId()).thenReturn(1L);
DataCondition dataCondition = new DataCondition();
dataCondition.setTargetDeptId(1L);
@@ -76,7 +77,7 @@ class DeptTreeDataPermissionCheckerTest {
void testCheckWhenFailed() {
DeptTreeDataPermissionChecker checker = new DeptTreeDataPermissionChecker(deptService);
Mockito.when(deptService.isChildOfTheDept(any(), any())).thenReturn(false);
when(deptService.isChildOfTheDept(any(), any())).thenReturn(false);
when(loginUser.getDeptId()).thenReturn(1L);
DataCondition dataCondition = new DataCondition();
dataCondition.setTargetDeptId(2L);

View File

@@ -1,11 +1,12 @@
package com.agileboot.infrastructure.web.domain.permission.checker;
package com.agileboot.admin.customize.service.permission;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.permission.DataCondition;
import com.agileboot.admin.customize.service.permission.model.checker.OnlySelfDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.admin.customize.service.permission.model.DataCondition;
import com.agileboot.orm.system.service.ISysDeptService;
import org.junit.jupiter.api.Test;
@@ -18,9 +19,9 @@ class OnlySelfDataPermissionCheckerTest {
OnlySelfDataPermissionChecker checker = new OnlySelfDataPermissionChecker(deptService);
boolean check1 = checker.check(null, null);
boolean check2 = checker.check(new LoginUser(), null);
boolean check2 = checker.check(new WebLoginUser(), null);
boolean check3 = checker.check(null, new DataCondition());
boolean check4 = checker.check(new LoginUser(), new DataCondition());
boolean check4 = checker.check(new WebLoginUser(), new DataCondition());
assertFalse(check1);
assertFalse(check2);
@@ -31,7 +32,7 @@ class OnlySelfDataPermissionCheckerTest {
@Test
void testCheckWhenSameUserId() {
OnlySelfDataPermissionChecker checker = new OnlySelfDataPermissionChecker(deptService);
LoginUser loginUser = new LoginUser();
WebLoginUser loginUser = new WebLoginUser();
loginUser.setUserId(1L);
DataCondition dataCondition = new DataCondition();
dataCondition.setTargetUserId(1L);
@@ -45,7 +46,7 @@ class OnlySelfDataPermissionCheckerTest {
@Test
void testCheckWhenDifferentUserId() {
OnlySelfDataPermissionChecker checker = new OnlySelfDataPermissionChecker(deptService);
LoginUser loginUser = new LoginUser();
WebLoginUser loginUser = new WebLoginUser();
loginUser.setUserId(1L);
DataCondition dataCondition = new DataCondition();
dataCondition.setTargetDeptId(2L);

View File

@@ -1,13 +1,14 @@
package com.agileboot.infrastructure.web.domain.permission.checker;
package com.agileboot.admin.customize.service.permission;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.admin.customize.service.permission.model.checker.SingleDeptDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.infrastructure.web.domain.login.RoleInfo;
import com.agileboot.infrastructure.web.domain.permission.DataCondition;
import com.agileboot.admin.customize.service.permission.model.DataCondition;
import com.agileboot.orm.system.service.ISysDeptService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -16,7 +17,7 @@ class SingleDeptDataPermissionCheckerTest {
private final ISysDeptService deptService = mock(ISysDeptService.class);
public LoginUser loginUser = mock(LoginUser.class);
public WebLoginUser loginUser = mock(WebLoginUser.class);
@BeforeEach
public void mockBefore() {
@@ -29,7 +30,7 @@ class SingleDeptDataPermissionCheckerTest {
SingleDeptDataPermissionChecker checker = new SingleDeptDataPermissionChecker(deptService);
boolean check1 = checker.check(null, null);
boolean check2 = checker.check(new LoginUser(), null);
boolean check2 = checker.check(new WebLoginUser(), null);
boolean check3 = checker.check(null, new DataCondition());
boolean check4 = checker.check(loginUser, new DataCondition());

View File

@@ -5,7 +5,7 @@ import com.agileboot.infrastructure.cache.guava.AbstractGuavaCacheTemplate;
import com.agileboot.infrastructure.cache.guava.GuavaCacheService;
import com.agileboot.infrastructure.cache.redis.RedisCacheService;
import com.agileboot.infrastructure.cache.redis.RedisCacheTemplate;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.infrastructure.web.domain.login.RoleInfo;
import com.agileboot.orm.system.entity.SysDeptEntity;
import com.agileboot.orm.system.entity.SysPostEntity;
@@ -29,7 +29,7 @@ public class CacheCenter {
public static RedisCacheTemplate<String> captchaCache;
public static RedisCacheTemplate<LoginUser> loginUserCache;
public static RedisCacheTemplate<WebLoginUser> loginUserCache;
public static RedisCacheTemplate<SysUserEntity> userCache;
@@ -51,7 +51,7 @@ public class CacheCenter {
loginUserCache = redisCache.loginUserCache;
userCache = redisCache.userCache;
roleCache = redisCache.roleCache;
roleModelInfoCache = redisCache.roleModelInfoCache;
// roleModelInfoCache = redisCache.roleModelInfoCache;
postCache = redisCache.postCache;
}

View File

@@ -1,7 +1,7 @@
package com.agileboot.domain.monitor.dto;
import com.agileboot.domain.common.cache.CacheCenter;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.orm.system.entity.SysDeptEntity;
import lombok.Data;
@@ -54,7 +54,7 @@ public class OnlineUserDTO {
private Long loginTime;
public OnlineUserDTO(LoginUser user) {
public OnlineUserDTO(WebLoginUser user) {
if (user == null) {
return;
}
@@ -65,7 +65,7 @@ public class OnlineUserDTO {
this.loginLocation = user.getLoginInfo().getLocation();
this.browser = user.getLoginInfo().getBrowser();
this.operationSystem = user.getLoginInfo().getOperationSystem();
this.loginTime = user.getLoginTime();
this.loginTime = user.getLoginInfo().getLoginTime();
SysDeptEntity deptEntity = CacheCenter.deptCache.get(user.getDeptId() + "");

View File

@@ -12,7 +12,7 @@ import com.agileboot.domain.system.menu.dto.RouterDTO;
import com.agileboot.domain.system.menu.model.MenuModel;
import com.agileboot.domain.system.menu.model.MenuModelFactory;
import com.agileboot.domain.system.menu.query.MenuQuery;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.orm.common.enums.StatusEnum;
import com.agileboot.orm.system.entity.SysMenuEntity;
import com.agileboot.orm.system.service.ISysMenuService;
@@ -51,7 +51,7 @@ public class MenuApplicationService {
return new MenuDetailDTO(byId);
}
public List<Tree<Long>> getDropdownList(LoginUser loginUser) {
public List<Tree<Long>> getDropdownList(WebLoginUser loginUser) {
List<SysMenuEntity> menuEntityList =
loginUser.isAdmin() ? menuService.list() : menuService.getMenuListByUserId(loginUser.getUserId());
@@ -116,7 +116,7 @@ public class MenuApplicationService {
}
public List<Tree<Long>> buildMenuEntityTree(LoginUser loginUser) {
public List<Tree<Long>> buildMenuEntityTree(WebLoginUser loginUser) {
List<SysMenuEntity> allMenus;
if (loginUser.isAdmin()) {
allMenus = menuService.list();
@@ -166,7 +166,7 @@ public class MenuApplicationService {
}
public List<RouterDTO> getRouterTree(LoginUser loginUser) {
public List<RouterDTO> getRouterTree(WebLoginUser loginUser) {
List<Tree<Long>> trees = buildMenuEntityTree(loginUser);
return buildRouterTree(trees);
}

View File

@@ -20,7 +20,7 @@ import com.agileboot.domain.system.user.dto.UserProfileDTO;
import com.agileboot.domain.system.user.model.UserModel;
import com.agileboot.domain.system.user.model.UserModelFactory;
import com.agileboot.domain.system.user.query.SearchUserQuery;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.orm.system.entity.SysPostEntity;
import com.agileboot.orm.system.entity.SysRoleEntity;
import com.agileboot.orm.system.entity.SysUserEntity;
@@ -77,7 +77,7 @@ public class UserApplicationService {
*
* @return 当前登录用户信息
*/
public CurrentLoginUserDTO getLoginUserInfo(LoginUser loginUser) {
public CurrentLoginUserDTO getLoginUserInfo(WebLoginUser loginUser) {
CurrentLoginUserDTO permissionDTO = new CurrentLoginUserDTO();
permissionDTO.setUserInfo(new UserDTO(CacheCenter.userCache.getObjectById(loginUser.getUserId())));
@@ -144,7 +144,7 @@ public class UserApplicationService {
CacheCenter.userCache.delete(model.getUserId());
}
public void deleteUsers(LoginUser loginUser, BulkOperationCommand<Long> command) {
public void deleteUsers(WebLoginUser loginUser, BulkOperationCommand<Long> command) {
for (Long id : command.getIds()) {
UserModel userModel = userModelFactory.loadById(id);
userModel.checkCanBeDelete(loginUser);
@@ -152,7 +152,7 @@ public class UserApplicationService {
}
}
public void updatePasswordBySelf(LoginUser loginUser, UpdateUserPasswordCommand command) {
public void updatePasswordBySelf(WebLoginUser loginUser, UpdateUserPasswordCommand command) {
UserModel userModel = userModelFactory.loadById(command.getUserId());
userModel.modifyPassword(command);
userModel.updateById();

View File

@@ -14,7 +14,7 @@ import com.agileboot.domain.system.user.command.UpdateProfileCommand;
import com.agileboot.domain.system.user.command.UpdateUserCommand;
import com.agileboot.domain.system.user.command.UpdateUserPasswordCommand;
import com.agileboot.infrastructure.security.AuthenticationUtils;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.orm.system.entity.SysUserEntity;
import com.agileboot.orm.system.service.ISysUserService;
import java.util.Objects;
@@ -114,7 +114,7 @@ public class UserModel extends SysUserEntity {
}
}
public void checkCanBeDelete(LoginUser loginUser) {
public void checkCanBeDelete(WebLoginUser loginUser) {
if (Objects.equals(getUserId(), loginUser.getUserId())
|| this.getIsAdmin()) {
throw new ApiException(ErrorCode.Business.USER_CURRENT_USER_CAN_NOT_BE_DELETE);

View File

@@ -11,7 +11,7 @@ import com.agileboot.domain.system.post.model.PostModelFactory;
import com.agileboot.domain.system.role.model.RoleModelFactory;
import com.agileboot.domain.system.user.command.UpdateUserPasswordCommand;
import com.agileboot.infrastructure.security.AuthenticationUtils;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.orm.system.service.ISysUserService;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -84,7 +84,7 @@ class UserModelTest {
void testCheckCanBeDeleteWhenDeleteItself() {
UserModel userModel = userModelFactory.create();
userModel.setUserId(USER_ID);
LoginUser loginUser = new LoginUser();
WebLoginUser loginUser = new WebLoginUser();
loginUser.setUserId(USER_ID);
ApiException exception = assertThrows(ApiException.class, () -> userModel.checkCanBeDelete(loginUser));
@@ -97,7 +97,7 @@ class UserModelTest {
UserModel userModel = userModelFactory.create();
long adminId = 1L;
userModel.setUserId(adminId);
LoginUser loginUser = new LoginUser();
WebLoginUser loginUser = new WebLoginUser();
loginUser.setUserId(2L);
ApiException exception = assertThrows(ApiException.class, () -> userModel.checkCanBeDelete(loginUser));
@@ -110,7 +110,7 @@ class UserModelTest {
void testCheckCanBeDeleteWhenSuccessful() {
UserModel userModel = userModelFactory.create();
userModel.setUserId(2L);
LoginUser loginUser = new LoginUser();
WebLoginUser loginUser = new WebLoginUser();
loginUser.setUserId(ADMIN_USER_ID);
Assertions.assertDoesNotThrow(() -> userModel.checkCanBeDelete(loginUser));

View File

@@ -6,9 +6,8 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.servlet.ServletUtil;
import cn.hutool.json.JSONUtil;
import com.agileboot.common.utils.ServletHolderUtil;
import com.agileboot.infrastructure.annotations.accessLog.AccessLog;
import com.agileboot.infrastructure.security.AuthenticationUtils;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.orm.common.enums.OperationStatusEnum;
import com.agileboot.orm.common.enums.RequestMethodEnum;
import com.agileboot.orm.common.enums.util.BasicEnumUtil;
@@ -38,7 +37,7 @@ public class OperationLogModel extends SysOperationLogEntity {
// 获取当前的用户
String ip = ServletUtil.getClientIP(request);
setOperatorIp(ip);
LoginUser loginUser = AuthenticationUtils.getLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getLoginUser();
if (loginUser != null) {
this.setUsername(loginUser.getUsername());
}

View File

@@ -5,7 +5,7 @@ import com.agileboot.common.exception.ApiException;
import com.agileboot.common.exception.error.ErrorCode;
import com.agileboot.common.utils.ServletHolderUtil;
import com.agileboot.infrastructure.security.AuthenticationUtils;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
@@ -77,7 +77,7 @@ public @interface RateLimit {
WEB_USER {
@Override
public String generateCombinedKey(RateLimit rateLimiter) {
LoginUser loginUser = AuthenticationUtils.getWebLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getWebLoginUser();
if (loginUser == null) {
throw new ApiException(ErrorCode.Client.COMMON_NO_AUTHORIZATION);
}
@@ -91,7 +91,7 @@ public @interface RateLimit {
APP_USER {
@Override
public String generateCombinedKey(RateLimit rateLimiter) {
LoginUser loginUser = AuthenticationUtils.getAppLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getAppLoginUser();
if (loginUser == null) {
throw new ApiException(ErrorCode.Client.COMMON_NO_AUTHORIZATION);
}

View File

@@ -2,7 +2,7 @@ package com.agileboot.infrastructure.annotations.unrepeatable;
import cn.hutool.core.util.StrUtil;
import com.agileboot.infrastructure.security.AuthenticationUtils;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
@@ -46,7 +46,7 @@ public @interface Unrepeatable {
String username;
try {
LoginUser loginUser = AuthenticationUtils.getAppLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getAppLoginUser();
username = loginUser.getUsername();
} catch (Exception e) {
username = NO_LOGIN;
@@ -69,7 +69,7 @@ public @interface Unrepeatable {
String username;
try {
LoginUser loginUser = AuthenticationUtils.getWebLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getWebLoginUser();
username = loginUser.getUsername();
} catch (Exception e) {
username = NO_LOGIN;

View File

@@ -2,9 +2,8 @@ package com.agileboot.infrastructure.cache.redis;
import cn.hutool.extra.spring.SpringUtil;
import com.agileboot.infrastructure.cache.RedisUtil;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.agileboot.infrastructure.web.domain.login.RoleInfo;
import com.agileboot.infrastructure.web.service.UserDetailsServiceImpl;
import com.agileboot.orm.system.entity.SysPostEntity;
import com.agileboot.orm.system.entity.SysRoleEntity;
import com.agileboot.orm.system.entity.SysUserEntity;
@@ -15,6 +14,7 @@ import java.io.Serializable;
import javax.annotation.PostConstruct;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Component;
/**
@@ -28,13 +28,13 @@ public class RedisCacheService {
private RedisUtil redisUtil;
public RedisCacheTemplate<String> captchaCache;
public RedisCacheTemplate<LoginUser> loginUserCache;
public RedisCacheTemplate<WebLoginUser> loginUserCache;
public RedisCacheTemplate<SysUserEntity> userCache;
public RedisCacheTemplate<SysRoleEntity> roleCache;
public RedisCacheTemplate<SysPostEntity> postCache;
public RedisCacheTemplate<RoleInfo> roleModelInfoCache;
// public RedisCacheTemplate<RoleInfo> roleModelInfoCache;
@PostConstruct
public void init() {
@@ -59,14 +59,14 @@ public class RedisCacheService {
}
};
roleModelInfoCache = new RedisCacheTemplate<RoleInfo>(redisUtil, CacheKeyEnum.ROLE_MODEL_INFO_KEY) {
@Override
public RoleInfo getObjectFromDb(Object id) {
UserDetailsServiceImpl userDetailsService = SpringUtil.getBean(UserDetailsServiceImpl.class);
return userDetailsService.getRoleInfo((Long) id);
}
};
// roleModelInfoCache = new RedisCacheTemplate<RoleInfo>(redisUtil, CacheKeyEnum.ROLE_MODEL_INFO_KEY) {
// @Override
// public RoleInfo getObjectFromDb(Object id) {
// UserDetailsService userDetailsService = SpringUtil.getBean(UserDetailsService.class);
// return userDetailsService.getRoleInfo((Long) id);
// }
//
// };
postCache = new RedisCacheTemplate<SysPostEntity>(redisUtil, CacheKeyEnum.POST_ENTITY_KEY) {
@Override

View File

@@ -1,7 +1,7 @@
package com.agileboot.infrastructure.mybatisplus;
import com.agileboot.infrastructure.security.AuthenticationUtils;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import java.util.Date;
import lombok.extern.slf4j.Slf4j;
@@ -49,7 +49,7 @@ public class CustomMetaObjectHandler implements MetaObjectHandler {
public Long getUserIdSafely() {
Long userId = null;
try {
LoginUser loginUser = AuthenticationUtils.getLoginUser();
WebLoginUser loginUser = AuthenticationUtils.getLoginUser();
userId = loginUser.getUserId();
} catch (Exception e) {
log.warn("can not find user in current thread.");

View File

@@ -3,7 +3,7 @@ package com.agileboot.infrastructure.security;
import com.agileboot.common.exception.ApiException;
import com.agileboot.common.exception.error.ErrorCode;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.login.WebLoginUser;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@@ -32,9 +32,9 @@ public class AuthenticationUtils {
* 获取用户
**/
@Deprecated
public static LoginUser getLoginUser() {
public static WebLoginUser getLoginUser() {
try {
return (LoginUser) getAuthentication().getPrincipal();
return (WebLoginUser) getAuthentication().getPrincipal();
} catch (Exception e) {
throw new ApiException(ErrorCode.Business.USER_FAIL_TO_GET_USER_INFO);
}
@@ -43,9 +43,9 @@ public class AuthenticationUtils {
/**
* 获取App用户
**/
public static LoginUser getAppLoginUser() {
public static WebLoginUser getAppLoginUser() {
try {
return (LoginUser) getAuthentication().getPrincipal();
return (WebLoginUser) getAuthentication().getPrincipal();
} catch (Exception e) {
throw new ApiException(ErrorCode.Business.USER_FAIL_TO_GET_USER_INFO);
}
@@ -54,9 +54,9 @@ public class AuthenticationUtils {
/**
* 获取App用户
**/
public static LoginUser getWebLoginUser() {
public static WebLoginUser getWebLoginUser() {
try {
return (LoginUser) getAuthentication().getPrincipal();
return (WebLoginUser) getAuthentication().getPrincipal();
} catch (Exception e) {
throw new ApiException(ErrorCode.Business.USER_FAIL_TO_GET_USER_INFO);
}

View File

@@ -20,67 +20,38 @@ import org.springframework.security.core.userdetails.UserDetails;
*/
@Data
@NoArgsConstructor
public class LoginUser implements UserDetails {
public class BaseLoginUser implements UserDetails {
private static final long serialVersionUID = 1L;
private Long userId;
protected Long userId;
/**
* 用户唯一标识缓存的key
*/
private String cachedKey;
protected String cachedKey;
private boolean isAdmin;
protected String username;
private String username;
private String password;
protected String password;
/**
* 登录信息
*/
private final LoginInfo loginInfo = new LoginInfo();
/**
* 登录时间
*/
private Long loginTime;
/**
* 当超过这个时间 则触发刷新缓存时间
*/
private Long autoRefreshCacheTime;
protected final LoginInfo loginInfo = new LoginInfo();
public LoginUser(Long userId, Boolean isAdmin, String username, String password) {
public BaseLoginUser(Long userId, String username, String password) {
this.userId = userId;
this.isAdmin = isAdmin;
this.username = username;
this.password = password;
}
public RoleInfo getRoleInfo() {
return SpringUtil.getBean(RedisCacheService.class).roleModelInfoCache.getObjectById(getRoleId());
}
public Long getRoleId() {
if (isAdmin()) {
return RoleInfo.ADMIN_ROLE_ID;
} else {
return SpringUtil.getBean(RedisCacheService.class).userCache.getObjectById(userId).getRoleId();
}
}
public Long getDeptId() {
return SpringUtil.getBean(RedisCacheService.class).userCache.getObjectById(userId).getDeptId();
}
/**
* 设置用户代理信息
*
*/
public void fillUserAgent() {
public void fillLoginInfo() {
UserAgent userAgent = UserAgent.parseUserAgentString(ServletHolderUtil.getRequest().getHeader("User-Agent"));
String ip = ServletUtil.getClientIP(ServletHolderUtil.getRequest());
@@ -88,6 +59,7 @@ public class LoginUser implements UserDetails {
this.getLoginInfo().setLocation(IpRegionUtil.getBriefLocationByIp(ip));
this.getLoginInfo().setBrowser(userAgent.getBrowser().getName());
this.getLoginInfo().setOperationSystem(userAgent.getOperatingSystem().getName());
this.getLoginInfo().setLoginTime(System.currentTimeMillis());
}

View File

@@ -28,4 +28,9 @@ public class LoginInfo {
*/
private String operationSystem;
/**
* 登录时间
*/
private Long loginTime;
}

View File

@@ -0,0 +1,53 @@
package com.agileboot.infrastructure.web.domain.login;
import cn.hutool.extra.spring.SpringUtil;
import com.agileboot.infrastructure.cache.redis.RedisCacheService;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 登录用户身份权限
* @author valarchie
*/
@Data
@NoArgsConstructor
public class WebLoginUser extends BaseLoginUser {
private static final long serialVersionUID = 1L;
private boolean isAdmin;
private Long deptId;
private RoleInfo roleInfo;
/**
* 当超过这个时间 则触发刷新缓存时间
*/
private Long autoRefreshCacheTime;
public WebLoginUser(Long userId, Boolean isAdmin, String username, String password, RoleInfo roleInfo,
Long deptId) {
this.userId = userId;
this.isAdmin = isAdmin;
this.username = username;
this.password = password;
this.roleInfo = roleInfo;
this.deptId = deptId;
}
public RoleInfo getRoleInfo() {
return roleInfo;
}
public Long getRoleId() {
return getRoleInfo().getRoleId();
}
public Long getDeptId() {
return deptId;
}
}

View File

@@ -1,25 +0,0 @@
package com.agileboot.infrastructure.web.domain.permission.checker;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.permission.AbstractDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.permission.DataCondition;
import com.agileboot.orm.system.service.ISysDeptService;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 数据权限测试接口
* @author valarchie
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class AllDataPermissionChecker extends AbstractDataPermissionChecker {
private ISysDeptService deptService;
@Override
public boolean check(LoginUser loginUser, DataCondition condition) {
return true;
}
}

View File

@@ -1,25 +0,0 @@
package com.agileboot.infrastructure.web.domain.permission.checker;
import com.agileboot.infrastructure.web.domain.login.LoginUser;
import com.agileboot.infrastructure.web.domain.permission.AbstractDataPermissionChecker;
import com.agileboot.infrastructure.web.domain.permission.DataCondition;
import com.agileboot.orm.system.service.ISysDeptService;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 数据权限测试接口
* @author valarchie
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class DefaultDataPermissionChecker extends AbstractDataPermissionChecker {
private ISysDeptService deptService;
@Override
public boolean check(LoginUser loginUser, DataCondition condition) {
return false;
}
}