use of io.jpom.model.dto.UserLoginDto in project Jpom by dromara.
the class LoginControl method userLogin.
/**
* 登录接口
*
* @param userName 登录名
* @param userPwd 登录密码
* @param code 验证码
* @return json
*/
@PostMapping(value = "userLogin", produces = MediaType.APPLICATION_JSON_VALUE)
@NotLogin
@Feature(method = MethodFeature.EXECUTE, resultCode = { 200, 201 }, logResponse = false)
public String userLogin(@ValidatorConfig(value = { @ValidatorItem(value = ValidatorRule.NOT_EMPTY, msg = "请输入登录信息") }) String userName, @ValidatorConfig(value = { @ValidatorItem(value = ValidatorRule.NOT_EMPTY, msg = "请输入登录信息") }) String userPwd, String code) {
if (this.ipLock()) {
return JsonMessage.getString(400, "尝试次数太多,请稍后再来");
}
synchronized (userName.intern()) {
UserModel userModel = userService.getByKey(userName);
if (userModel == null) {
this.ipError();
return JsonMessage.getString(400, "登录失败,请输入正确的密码和账号,多次失败将锁定账号");
}
// 获取验证码
String sCode = getSessionAttribute(LOGIN_CODE);
Assert.state(StrUtil.equalsIgnoreCase(code, sCode), "请输入正确的验证码");
removeSessionAttribute(LOGIN_CODE);
UserModel updateModel = null;
try {
long lockTime = userModel.overLockTime();
if (lockTime > 0) {
String msg = DateUtil.formatBetween(lockTime * 1000, BetweenFormatter.Level.SECOND);
updateModel = userModel.errorLock();
this.ipError();
return JsonMessage.getString(400, "该账户登录失败次数过多,已被锁定" + msg + ",请不要再次尝试");
}
// 验证
if (userService.simpleLogin(userName, userPwd) != null) {
updateModel = UserModel.unLock(userName);
this.ipSuccess();
// 判断是否开启 两步验证
boolean bindMfa = userService.hasBindMfa(userName);
if (bindMfa) {
//
JSONObject jsonObject = new JSONObject();
String uuid = IdUtil.fastSimpleUUID();
MFA_TOKEN.put(uuid, userName);
jsonObject.put("tempToken", uuid);
return JsonMessage.getString(201, "请输入两步验证码", jsonObject);
}
UserLoginDto userLoginDto = this.createToken(userModel);
return JsonMessage.getString(200, "登录成功", userLoginDto);
} else {
updateModel = userModel.errorLock();
this.ipError();
return JsonMessage.getString(501, "登录失败,请输入正确的密码和账号,多次失败将锁定账号");
}
} finally {
if (updateModel != null) {
userService.update(updateModel);
}
// 用于记录登录日志
BaseServerController.resetInfo(userModel);
}
}
}
use of io.jpom.model.dto.UserLoginDto in project Jpom by dromara.
the class LoginControl method createToken.
private UserLoginDto createToken(UserModel userModel) {
// 判断工作空间
List<WorkspaceModel> bindWorkspaceModels = userBindWorkspaceService.listUserWorkspaceInfo(userModel);
Assert.notEmpty(bindWorkspaceModels, "当前账号没有绑定任何工作空间,请联系管理员处理");
setSessionAttribute(LoginInterceptor.SESSION_NAME, userModel);
UserLoginDto userLoginDto = userService.getUserJwtId(userModel);
// UserLoginDto userLoginDto = new UserLoginDto(JwtUtil.builder(userModel, jwtId), jwtId);
userLoginDto.setBindWorkspaceModels(bindWorkspaceModels);
return userLoginDto;
}
use of io.jpom.model.dto.UserLoginDto in project Jpom by dromara.
the class InstallController method installSubmit.
/**
* 初始化提交
*
* @param userName 系统管理员登录名
* @param userPwd 系统管理员的登录密码
* @return json
* @api {post} install_submit.json 初始化提交
* @apiGroup index
* @apiUse defResultJson
* @apiParam {String} userName 系统管理员登录名
* @apiParam {String} userPwd 设置的登录密码 sha1 后传入
* @apiSuccess {JSON} data.tokenData token 相关信息
* @apiSuccess {String} data.mfaKey 二次验证的key
* @apiSuccess {String} data.url 二次验证的二维码相关字符串用户快速扫码导入
*/
@PostMapping(value = "install_submit.json", produces = MediaType.APPLICATION_JSON_VALUE)
@NotLogin
public String installSubmit(@ValidatorConfig(value = { @ValidatorItem(value = ValidatorRule.NOT_EMPTY, msg = "登录名不能为空"), @ValidatorItem(value = ValidatorRule.NOT_BLANK, range = UserModel.USER_NAME_MIN_LEN + ":" + Const.ID_MAX_LEN, msg = "登录名长度范围" + UserModel.USER_NAME_MIN_LEN + "-" + Const.ID_MAX_LEN), @ValidatorItem(value = ValidatorRule.WORD, msg = "登录名不能包含汉字并且不能包含特殊字符") }) String userName, @ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "密码不能为空") String userPwd) {
//
Assert.state(!userService.canUse(), "系统已经初始化过啦,请勿重复初始化");
boolean systemOccupyUserName = StrUtil.equalsAnyIgnoreCase(userName, UserModel.DEMO_USER, JpomApplication.SYSTEM_ID, UserModel.SYSTEM_ADMIN);
Assert.state(!systemOccupyUserName, "当前登录名已经被系统占用啦");
// 创建用户
UserModel userModel = new UserModel();
userModel.setName(UserModel.SYSTEM_OCCUPY_NAME);
userModel.setId(userName);
userModel.setSalt(userService.generateSalt());
userModel.setPassword(SecureUtil.sha1(userPwd + userModel.getSalt()));
userModel.setSystemUser(1);
userModel.setParent(UserModel.SYSTEM_ADMIN);
try {
BaseServerController.resetInfo(userModel);
userService.insert(userModel);
} catch (Exception e) {
DefaultSystemLog.getLog().error("初始化用户失败", e);
return JsonMessage.getString(400, "初始化失败:" + e.getMessage());
}
// 自动登录
setSessionAttribute(LoginInterceptor.SESSION_NAME, userModel);
UserLoginDto userLoginDto = userService.getUserJwtId(userModel);
List<WorkspaceModel> bindWorkspaceModels = userBindWorkspaceService.listUserWorkspaceInfo(userModel);
userLoginDto.setBindWorkspaceModels(bindWorkspaceModels);
// 二次验证信息
JSONObject jsonObject = new JSONObject();
String tfaKey = TwoFactorAuthUtils.generateTFAKey();
jsonObject.put("mfaKey", tfaKey);
jsonObject.put("url", TwoFactorAuthUtils.generateOtpAuthUrl(userName, tfaKey));
jsonObject.put("tokenData", userLoginDto);
return JsonMessage.getString(200, "初始化成功", jsonObject);
}
use of io.jpom.model.dto.UserLoginDto in project Jpom by dromara.
the class LoginControl method renewalToken.
/**
* 刷新token
*
* @return json
*/
@RequestMapping(value = "renewal", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
@NotLogin
public String renewalToken() {
String token = getRequest().getHeader(ServerOpenApi.HTTP_HEAD_AUTHORIZATION);
if (StrUtil.isEmpty(token)) {
return JsonMessage.getString(ServerConfigBean.AUTHORIZE_TIME_OUT_CODE, "刷新token失败");
}
JWT jwt = JwtUtil.readBody(token);
if (JwtUtil.expired(jwt, 0)) {
int renewal = ServerExtConfigBean.getInstance().getAuthorizeRenewal();
if (jwt == null || renewal <= 0 || JwtUtil.expired(jwt, TimeUnit.MINUTES.toSeconds(renewal))) {
return JsonMessage.getString(ServerConfigBean.AUTHORIZE_TIME_OUT_CODE, "刷新token超时");
}
}
UserModel userModel = userService.checkUser(JwtUtil.getId(jwt));
if (userModel == null) {
return JsonMessage.getString(ServerConfigBean.AUTHORIZE_TIME_OUT_CODE, "没有对应的用户");
}
UserLoginDto userLoginDto = userService.getUserJwtId(userModel);
return JsonMessage.getString(200, "", userLoginDto);
}
use of io.jpom.model.dto.UserLoginDto in project Jpom by dromara.
the class LoginControl method mfaVerify.
@GetMapping(value = "mfa_verify", produces = MediaType.APPLICATION_JSON_VALUE)
@NotLogin
public String mfaVerify(String token, String code) {
String userId = MFA_TOKEN.get(token);
if (StrUtil.isEmpty(userId)) {
return JsonMessage.getString(201, "登录信息已经过期请重新登录");
}
boolean mfaCode = userService.verifyMfaCode(userId, code);
Assert.state(mfaCode, "验证码不正确,请重新输入");
UserModel userModel = userService.getByKey(userId);
//
UserLoginDto userLoginDto = this.createToken(userModel);
MFA_TOKEN.remove(token);
return JsonMessage.getString(200, "登录成功", userLoginDto);
}
Aggregations