张天森
2022-09-29 4c80d2017a3b88b9ad55f28c3b87fd96eb67bcb2
springcloud_k8s_panzhihuazhihuishequ/auth/src/main/java/com/panzhihua/auth/handel/UserAuthenticationProvider.java
@@ -13,6 +13,7 @@
import javax.crypto.NoSuchPaddingException;
import com.panzhihua.auth.config.MyAESUtil;
import com.panzhihua.common.constants.Constants;
import com.panzhihua.common.model.helper.AESUtil;
import com.panzhihua.common.utlis.AES;
import org.springframework.beans.factory.annotation.Value;
@@ -54,49 +55,91 @@
        // 获取表单输入中返回的用户名
        String userName = (String)authentication.getPrincipal();
        String password =(String)authentication.getCredentials();
        try {
            password = MyAESUtil.Decrypt((String)authentication.getCredentials(),"Ryo7M3n8loC5Abcd");
        } catch (Exception e) {
            e.printStackTrace();
        if(!userName.contains("_1")&&!userName.contains("_6")){
            try {
                password = MyAESUtil.Decrypt((String)authentication.getCredentials(),"Ryo7M3n8loC5Abcd");
            } catch (Exception e) {
                e.printStackTrace();
            }
            boolean flag= redisTemplate.hasKey(LOGIN_FAIL+userName);
            if(flag){
                Integer time= (Integer) redisTemplate.opsForValue().get(LOGIN_FAIL+userName);
                if(time>=5){
                    redisTemplate.opsForValue().set(LOGIN_FAIL+userName,5);
                    throw new LockedException("登录错误超过限制,账号已被锁定");
                }
            }
            // 查询用户是否存在
            R<LoginUserInfoVO> r = userService.getUserInfo(userName);
            if (r.getCode() != 200) {
                lockLogin(flag,userName);
                throw new UsernameNotFoundException("账号或密码错误");
            }
            LoginUserInfoVO loginUserInfoVO = r.getData();
            List<GrantedAuthority> grantedAuthorityList = new ArrayList<>();
            Set<String> roles = loginUserInfoVO.getRoles();
            if (!ObjectUtils.isEmpty(roles)) {
                roles.forEach(s -> {
                    grantedAuthorityList.add(new SimpleGrantedAuthority(s));
                });
            }
            if (ObjectUtils.isEmpty(loginUserInfoVO.getAccount())||ObjectUtils.isEmpty(password)) {
                lockLogin(flag,userName);
                throw new UsernameNotFoundException("账号或密码错误");
            }
            // 我们还要判断密码是否正确,这里我们的密码使用BCryptPasswordEncoder进行加密的
            if (!new BCryptPasswordEncoder().matches(password, loginUserInfoVO.getPassword())) {
                lockLogin(flag,userName);
                throw new BadCredentialsException("密码不正确");
            }
            // 还可以加一些其他信息的判断,比如用户账号已停用等判断
            if (loginUserInfoVO.getStatus().intValue() == 2) {
                throw new LockedException("该用户已被禁用");
            }
            // 维护最后登录时间
            userService.putUserLastLoginTime(loginUserInfoVO.getUserId());
            //是否为专家登陆
            R r1 = userService.isExpert(loginUserInfoVO.getPhone());
            if (r1.getCode()== Constants.SUCCESS){
                loginUserInfoVO.setType(13);
            }
            return new UsernamePasswordAuthenticationToken(loginUserInfoVO, password, grantedAuthorityList);
        }
        boolean flag= redisTemplate.hasKey(LOGIN_FAIL+userName);
        if(flag){
           Integer time= (Integer) redisTemplate.opsForValue().get(LOGIN_FAIL+userName);
           if(time>=5){
               redisTemplate.opsForValue().set(LOGIN_FAIL+userName,5, Duration.ofMinutes(5));
               throw new LockedException("登录错误超过限制,请五分钟后重试");
           }
        else {
            // 查询用户是否存在
            R<LoginUserInfoVO> r = userService.getUserInfo(userName);
            if (r.getCode() != 200) {
                throw new UsernameNotFoundException("该账号不存在");
            }
            LoginUserInfoVO loginUserInfoVO = r.getData();
            List<GrantedAuthority> grantedAuthorityList = new ArrayList<>();
            Set<String> roles = loginUserInfoVO.getRoles();
            if (!ObjectUtils.isEmpty(roles)) {
                roles.forEach(s -> {
                    grantedAuthorityList.add(new SimpleGrantedAuthority(s));
                });
            }
            if (ObjectUtils.isEmpty(loginUserInfoVO.getAccount())) {
                throw new UsernameNotFoundException("该账号不存在");
            }
            // 我们还要判断密码是否正确,这里我们的密码使用BCryptPasswordEncoder进行加密的
            if (!new BCryptPasswordEncoder().matches(password, loginUserInfoVO.getPassword())) {
                throw new BadCredentialsException("密码不正确");
            }
            // 还可以加一些其他信息的判断,比如用户账号已停用等判断
            if (loginUserInfoVO.getStatus().intValue() == 2) {
                throw new LockedException("该用户已被禁用");
            }
            // 维护最后登录时间
            userService.putUserLastLoginTime(loginUserInfoVO.getUserId());
            //是否为专家登陆
            R r1 = userService.isExpert(loginUserInfoVO.getPhone());
            if (r1.getCode()== Constants.SUCCESS){
                loginUserInfoVO.setType(13);
            }
            return new UsernamePasswordAuthenticationToken(loginUserInfoVO, password, grantedAuthorityList);
        }
        // 查询用户是否存在
        R<LoginUserInfoVO> r = userService.getUserInfo(userName);
        if (r.getCode() != 200) {
            lockLogin(flag,userName);
            throw new UsernameNotFoundException("账号或密码错误");
        }
        LoginUserInfoVO loginUserInfoVO = r.getData();
        List<GrantedAuthority> grantedAuthorityList = new ArrayList<>();
        Set<String> roles = loginUserInfoVO.getRoles();
        if (!ObjectUtils.isEmpty(roles)) {
            roles.forEach(s -> {
                grantedAuthorityList.add(new SimpleGrantedAuthority(s));
            });
        }
        if (ObjectUtils.isEmpty(loginUserInfoVO.getAccount())||ObjectUtils.isEmpty(password)) {
            lockLogin(flag,userName);
            throw new UsernameNotFoundException("账号或密码错误");
        }
        // 我们还要判断密码是否正确,这里我们的密码使用BCryptPasswordEncoder进行加密的
        if (!new BCryptPasswordEncoder().matches(password, loginUserInfoVO.getPassword())) {
            lockLogin(flag,userName);
            throw new BadCredentialsException("密码不正确");
        }
        // 还可以加一些其他信息的判断,比如用户账号已停用等判断
        if (loginUserInfoVO.getStatus().intValue() == 2) {
            throw new LockedException("该用户已被禁用");
        }
        // 维护最后登录时间
        userService.putUserLastLoginTime(loginUserInfoVO.getUserId());
        return new UsernamePasswordAuthenticationToken(loginUserInfoVO, password, grantedAuthorityList);
    }
    @Override