动态路由

This commit is contained in:
dengqichen 2025-10-31 22:48:08 +08:00
parent f8e520e2fc
commit d4e4beb3a7

View File

@ -2,9 +2,11 @@ package com.qqchen.deploy.backend.system.service.impl;
import com.qqchen.deploy.backend.framework.security.CustomUserDetails; import com.qqchen.deploy.backend.framework.security.CustomUserDetails;
import com.qqchen.deploy.backend.system.entity.User; import com.qqchen.deploy.backend.system.entity.User;
import com.qqchen.deploy.backend.system.repository.IPermissionRepository;
import com.qqchen.deploy.backend.system.repository.IUserRepository; import com.qqchen.deploy.backend.system.repository.IUserRepository;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.Hibernate; import org.hibernate.Hibernate;
import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
@ -23,6 +25,7 @@ import java.util.stream.Collectors;
* @author qqchen * @author qqchen
* @date 2025-10-25 * @date 2025-10-25
*/ */
@Slf4j
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class UserDetailsServiceImpl implements UserDetailsService { public class UserDetailsServiceImpl implements UserDetailsService {
@ -30,25 +33,32 @@ public class UserDetailsServiceImpl implements UserDetailsService {
@Resource @Resource
private final IUserRepository userRepository; private final IUserRepository userRepository;
@Resource
private final IPermissionRepository permissionRepository;
@Override @Override
@Transactional(readOnly = true) @Transactional(readOnly = true)
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsernameAndDeletedFalse(username) User user = userRepository.findByUsernameAndDeletedFalse(username)
.orElseThrow(() -> new UsernameNotFoundException("用户不存在: " + username)); .orElseThrow(() -> new UsernameNotFoundException("用户不存在: " + username));
// 从数据库加载用户实际权限 // 批量加载用户权限(避免N+1查询)
Hibernate.initialize(user.getRoles()); // 加载角色 Hibernate.initialize(user.getRoles()); // 加载角色
List<SimpleGrantedAuthority> authorities = user.getRoles().stream() List<Long> roleIds = user.getRoles().stream()
.flatMap(role -> { .map(role -> role.getId())
Hibernate.initialize(role.getPermissions()); // 加载权限 .collect(Collectors.toList());
return role.getPermissions().stream();
}) // 使用原生SQL批量查询所有权限(1次查询,避免N+1问题)
List<SimpleGrantedAuthority> authorities = permissionRepository.findByRoleIds(roleIds).stream()
.map(permission -> new SimpleGrantedAuthority(permission.getCode())) .map(permission -> new SimpleGrantedAuthority(permission.getCode()))
.distinct() .distinct()
.collect(Collectors.toList()); .collect(Collectors.toList());
// 返回自定义 UserDetails包含用户ID等扩展信息 log.debug("加载用户 {} 的权限: {} 个角色, {} 个权限",
username, roleIds.size(), authorities.size());
// 返回自定义 UserDetails,包含用户ID等扩展信息
return new CustomUserDetails( return new CustomUserDetails(
user.getId(), // 用户ID user.getId(), // 用户ID
user.getUsername(), // 用户名 user.getUsername(), // 用户名
@ -58,4 +68,3 @@ public class UserDetailsServiceImpl implements UserDetailsService {
); );
} }
} }