Search in sources :

Example 1 with UserLoginDto

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);
        }
    }
}
Also used : UserModel(io.jpom.model.data.UserModel) JSONObject(com.alibaba.fastjson.JSONObject) UserLoginDto(io.jpom.model.dto.UserLoginDto) NotLogin(io.jpom.common.interceptor.NotLogin) Feature(io.jpom.permission.Feature) MethodFeature(io.jpom.permission.MethodFeature) ClassFeature(io.jpom.permission.ClassFeature)

Example 2 with UserLoginDto

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;
}
Also used : WorkspaceModel(io.jpom.model.data.WorkspaceModel) UserLoginDto(io.jpom.model.dto.UserLoginDto)

Example 3 with 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);
}
Also used : UserModel(io.jpom.model.data.UserModel) WorkspaceModel(io.jpom.model.data.WorkspaceModel) JSONObject(com.alibaba.fastjson.JSONObject) UserLoginDto(io.jpom.model.dto.UserLoginDto) NotLogin(io.jpom.common.interceptor.NotLogin) PostMapping(org.springframework.web.bind.annotation.PostMapping)

Example 4 with UserLoginDto

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);
}
Also used : UserModel(io.jpom.model.data.UserModel) JWT(cn.hutool.jwt.JWT) UserLoginDto(io.jpom.model.dto.UserLoginDto) NotLogin(io.jpom.common.interceptor.NotLogin)

Example 5 with 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);
}
Also used : UserModel(io.jpom.model.data.UserModel) UserLoginDto(io.jpom.model.dto.UserLoginDto) NotLogin(io.jpom.common.interceptor.NotLogin)

Aggregations

UserLoginDto (io.jpom.model.dto.UserLoginDto)6 NotLogin (io.jpom.common.interceptor.NotLogin)4 UserModel (io.jpom.model.data.UserModel)4 JSONObject (com.alibaba.fastjson.JSONObject)2 WorkspaceModel (io.jpom.model.data.WorkspaceModel)2 Entity (cn.hutool.db.Entity)1 JWT (cn.hutool.jwt.JWT)1 ClassFeature (io.jpom.permission.ClassFeature)1 Feature (io.jpom.permission.Feature)1 MethodFeature (io.jpom.permission.MethodFeature)1 PostMapping (org.springframework.web.bind.annotation.PostMapping)1