package cn.exrick.xboot.core.config.security; import cn.exrick.xboot.core.common.exception.LoginFailLimitException; import cn.exrick.xboot.core.common.redis.RedisTemplateHelper; import cn.exrick.xboot.core.common.utils.NameUtil; import cn.exrick.xboot.core.entity.User; import cn.exrick.xboot.core.service.UserService; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; 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.Component; import java.util.concurrent.TimeUnit; /** * @author Exrickx */ @Slf4j @Component public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private RedisTemplateHelper redisTemplate; @Autowired private UserService userService; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { String flagKey = "loginFailFlag:" + username; String value = redisTemplate.get(flagKey); Long timeRest = redisTemplate.getExpire(flagKey, TimeUnit.MINUTES); if (StrUtil.isNotBlank(value)) { // 超过限制次数 throw new LoginFailLimitException("登录错误次数超过限制,请" + timeRest + "分钟后再试"); } User user; if (NameUtil.mobile(username)) { user = userService.findByMobile(username); } else if (NameUtil.email(username)) { user = userService.findByEmail(username); } else { user = userService.findByUsername(username); } return new SecurityUserDetails(user); } }