package co.jp.app.service; import java.util.Collection; import java.util.Collections; import java.util.List; import co.jp.app.dto.RegistrationDto; import co.jp.app.entity.UserEntity; import co.jp.app.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; 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.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import co.jp.app.entity.PetEntity; import co.jp.app.repository.UploadRepository; import org.springframework.transaction.annotation.Transactional; @Service public class UserService implements UserDetailsService { private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; @Autowired public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder) { this.userRepository = userRepository; this.passwordEncoder = passwordEncoder; } @Transactional public UserEntity registerNewUser(RegistrationDto registrationDto) throws Exception { if (userRepository.existsByEmail(registrationDto.getEmail())) { throw new Exception("错误:邮箱 " + registrationDto.getEmail() + " 已被注册!"); } UserEntity newUser = new UserEntity(); newUser.setName(registrationDto.getName()); newUser.setEmail(registrationDto.getEmail()); newUser.setPassword(passwordEncoder.encode(registrationDto.getPassword())); return userRepository.save(newUser); } @Override @Transactional(readOnly = true) public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { UserEntity userEntity = userRepository.findByEmail(email) .orElseThrow(() -> new UsernameNotFoundException("未找到邮箱为: " + email + " 的用户")); Collection authorities = Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER")); // 示例:给所有用户一个ROLE_USER权限 return new User( userEntity.getEmail(), userEntity.getPassword(), true, // enabled true, // accountNonExpired true, // credentialsNonExpired true, // accountNonLocked authorities // 用户的权限集合 ); } public boolean checkPassword(UserEntity user, String rawPassword) { return passwordEncoder.matches(rawPassword, user.getPassword()); } }