我们部署Yapi一般都要吧注册功能禁用掉,但是怎么添加用户呢,下边我们实现一个简单的使用Java修改Mongo数据添加用户,直接上代码
pom.xml 添加如下依赖
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.8.2</version>
</dependency>
Java编写测试类
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.WriteConcern;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.FindOneAndUpdateOptions;
import com.mongodb.client.model.ReturnDocument;
import org.apache.commons.codec.digest.DigestUtils;
import org.bson.Document;
import static com.mongodb.client.model.Filters.eq;
import static com.mongodb.client.model.Updates.inc;
/**
* 功能描述 : Yapi一键注册用户方法
*
* @author Ziyear 2022-01-18 11:04
*/
public class YapiRegUser {
/**
* 默认密码
*/
private static final String DEFAULT_PASSWORD = "Yapi1234";
/**
* yapi Database
*/
private static final MongoDatabase YAPI_DB;
/*
* 初始化mongo
*/
static {
System.out.println("===============MongoDBUtil初始化========================");
MongoClient mongoClient = new MongoClient("192.168.50.254", 27017);
// 大部分用户使用mongodb都在安全内网下,但如果将mongodb设为安全验证模式,就需要在客户端提供用户名和密码:
// boolean auth = db.authenticate(myUserName, myPassword);
MongoClientOptions.Builder options = new MongoClientOptions.Builder();
options.cursorFinalizerEnabled(true);
// options.autoConnectRetry(true);// 自动重连true
// options.maxAutoConnectRetryTime(10); // the maximum auto connect retry time
options.connectionsPerHost(300);// 连接池设置为300个连接,默认为100
options.connectTimeout(30000);// 连接超时,推荐>3000毫秒
options.maxWaitTime(5000); //
options.socketTimeout(0);// 套接字超时时间,0无限制
options.threadsAllowedToBlockForConnectionMultiplier(5000);// 线程队列数,如果连接线程排满了队列就会抛出“Out of semaphores to get db”错误。
options.writeConcern(WriteConcern.SAFE);//
options.build();
YAPI_DB = mongoClient.getDatabase("yapi");
}
public static void main(String[] args) {
initPassword("user@admin.com");
}
/**
* 功能描述 : 创建用户
*
* @param email
*/
private static void register(String email) {
MongoCollection<Document> user = YAPI_DB.getCollection("user");
Document exist = findExist(user, email);
if (exist != null) {
throw new RuntimeException("邮箱已存在!");
}
String passsalt = randomStr();
String sPassword = DigestUtils.sha1Hex(DEFAULT_PASSWORD + DigestUtils.sha1Hex(passsalt));
String username = email.substring(0, email.indexOf('@'));
Document insert = new Document();
insert.put("_id", getNextId());
insert.put("__v", 0);
insert.put("username", username);
insert.put("password", sPassword);
insert.put("email", email);
insert.put("passsalt", passsalt);
insert.put("role", "member");
insert.put("add_time", getDate());
insert.put("up_time", getDate());
insert.put("study", true);
insert.put("type", "site");
user.insertOne(insert);
}
/**
* 功能描述 : 删除用户
*
* @param email
*/
private static void delByEmail(String email) {
YAPI_DB.getCollection("user").deleteOne(eq("email", email));
}
/**
* 功能描述 : 初始化密码
*
* @param email
*/
private static void initPassword(String email) {
MongoCollection<Document> user = YAPI_DB.getCollection("user");
Document exist = findExist(user, email);
if (exist == null) {
throw new RuntimeException("用户不存在!");
}
String passsalt = randomStr();
String sPassword = DigestUtils.sha1Hex(DEFAULT_PASSWORD + DigestUtils.sha1Hex(passsalt));
Document update = new Document();
update.put("passsalt", passsalt);
update.put("password", sPassword);
update.put("up_time", getDate());
user.updateOne(eq("email", email), new Document("$set", update));
}
/**
* 功能描述 : 查询存在的用户
*
* @return {@link Document}
*/
private static Document findExist(MongoCollection<Document> user, String email) {
MongoCursor<Document> iterator = user.find(eq("email", email)).iterator();
if (iterator.hasNext()) {
return iterator.next();
}
return null;
}
/**
* 功能描述 : 获取随机盐
*
* @return {@link int}
*/
private static String randomStr() {
return Long.toString(Double.doubleToLongBits(Math.random()), 36).substring(2);
}
/**
* 功能描述 : 获取时间戳
*
* @return {@link int}
*/
public static int getDate() {
return (int) (System.currentTimeMillis() / 1000);
}
/**
* 获取下一个自增ID
*
* @return 序列值
*/
private static Integer getNextId() {
MongoCollection<Document> seqColl = YAPI_DB.getCollection("identitycounters");
Document query = new Document();
query.put("model", "user");
query.put("field", "_id");
FindOneAndUpdateOptions options = new FindOneAndUpdateOptions();
options.upsert(true);
options.returnDocument(ReturnDocument.AFTER);
Document andUpdate = seqColl.findOneAndUpdate(query, inc("count", 1), options);
assert andUpdate != null;
return andUpdate.getInteger("count");
}
}