动态路由
This commit is contained in:
parent
f8e520e2fc
commit
d4e4beb3a7
@ -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 {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user