From 5aa2ff89c0fb5f5bf243ac01b44863c0cb844a94 Mon Sep 17 00:00:00 2001 From: myh Date: Sun, 3 Dec 2023 23:44:38 +0800 Subject: [PATCH] extend Spring Security UserDetailService class --- .../springdemo/service/UsersService.java | 3 +- .../UsersServiceImpl.java | 48 ++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) rename src/main/java/com/example/springdemo/{service => serviceImpl}/UsersServiceImpl.java (54%) diff --git a/src/main/java/com/example/springdemo/service/UsersService.java b/src/main/java/com/example/springdemo/service/UsersService.java index c4c060d..f4fd56e 100644 --- a/src/main/java/com/example/springdemo/service/UsersService.java +++ b/src/main/java/com/example/springdemo/service/UsersService.java @@ -2,11 +2,12 @@ package com.example.springdemo.service; import com.example.springdemo.entities.Users; import com.example.springdemo.entities.password.UsersPassword; +import org.springframework.security.core.userdetails.UserDetailsService; import java.util.List; import java.util.Optional; -public interface UsersService { +public interface UsersService extends UserDetailsService { Users addUser(Users user, UsersPassword userPassword); diff --git a/src/main/java/com/example/springdemo/service/UsersServiceImpl.java b/src/main/java/com/example/springdemo/serviceImpl/UsersServiceImpl.java similarity index 54% rename from src/main/java/com/example/springdemo/service/UsersServiceImpl.java rename to src/main/java/com/example/springdemo/serviceImpl/UsersServiceImpl.java index 048b378..c36dfb1 100644 --- a/src/main/java/com/example/springdemo/service/UsersServiceImpl.java +++ b/src/main/java/com/example/springdemo/serviceImpl/UsersServiceImpl.java @@ -1,17 +1,31 @@ -package com.example.springdemo.service; +package com.example.springdemo.serviceImpl; import com.example.springdemo.dao.UsersPasswordRepository; import com.example.springdemo.dao.UsersRepository; +import com.example.springdemo.entities.RBAC.Permissions; +import com.example.springdemo.entities.RBAC.Roles; import com.example.springdemo.entities.Users; import com.example.springdemo.entities.password.UsersPassword; +import com.example.springdemo.service.PermissionsService; +import com.example.springdemo.service.UsersService; import jakarta.annotation.Resource; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Optional; @Service +@Component public class UsersServiceImpl implements UsersService { @Resource private UsersRepository usersRepository; @@ -19,6 +33,9 @@ public class UsersServiceImpl implements UsersService { @Resource private UsersPasswordRepository usersPasswordRepository; + @Resource + private PermissionsService permissionsService; + @Override @Transactional(rollbackFor = Exception.class) //添加用户时同步添加密码 @@ -74,9 +91,38 @@ public class UsersServiceImpl implements UsersService { } @Override + @Modifying @Transactional(rollbackFor = Exception.class) //更新用户密码 public int updateUserPasswordById(String password, Long userId) { return usersPasswordRepository.updatePassword(password, userId); } + + //根据用户名获取用户信息 + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + Collection authorities = new ArrayList<>(); + // 从数据库中取出用户信息 + Users user = usersRepository.findByName(username).orElse(null); + // 判断用户是否存在 + if (user == null) { + throw new UsernameNotFoundException("用户名不存在"); + } + // 取出密码 + String password = usersPasswordRepository.findByUsersId(user.getId()).getPassword(); + + // 用户角色 + Roles role = user.getRoles(); + authorities.add(new SimpleGrantedAuthority("ROLE_".concat(role.getName()))); + + //用户权限 + List permissions = permissionsService.findPermissionsByRoleId(role.getId()); + for (Permissions permission : permissions) { + SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(permission.getName()); + authorities.add(simpleGrantedAuthority); + } + + // 返回UserDetails实现类 + return new User(user.getName(), "{noop}" + password, authorities); + } }