package com.jty.wsxt.infrastructure.security; import com.jty.wsxt.application.service.AuthAuthorityService; import com.jty.wsxt.domain.model.auth.user.AuthUser; import com.jty.wsxt.domain.model.auth.user.UserRepository; import com.jty.wsxt.infrastructure.support.BusinessException; import com.jty.wsxt.infrastructure.support.ResultCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.regex.Matcher; import java.util.regex.Pattern; @Service public class MyUserDetailService implements UserDetailsService { private final UserRepository userRepository; @Autowired private AuthAuthorityService authAuthorityService; @Autowired public MyUserDetailService(UserRepository userRepository) { this.userRepository = userRepository; } /** * 根据配置信息确认是否需要查找用户相应学校 * 如果需要,根据学校信息生成用户的有效期等内容 * * @param username * @return * @throws UsernameNotFoundException */ @Override @Transactional public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { Pattern p = Pattern.compile("^[1][0-9]{10}$"); // 验证手机号 Matcher m = p.matcher(username); Boolean isMobile = m.matches(); AuthUser user; MyUserDetail detail = new MyUserDetail(); if (isMobile) { user = userRepository.findByMobile(username).orElseThrow(() -> new BusinessException(ResultCode.USER_LOGIN_ERROR)); detail.setUsername(user.getMobile()); } else { user = userRepository.findByAccount(username).orElseThrow(() -> new BusinessException(ResultCode.USER_LOGIN_ERROR)); detail.setUsername(user.getAccount()); } detail.setUserId(user.getId()); detail.setRealName(user.getRealName()); detail.setPassword(user.getPassword()); detail.setEnabled(user.getEnabled()); detail.setAuthorities(authAuthorityService.getAuthority(user.getId())); return detail; } }