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);
|
}
|
}
|