Search in sources :

Example 1 with UserSessionBean

use of com.akaxin.site.storage.bean.UserSessionBean in project openzaly by akaxincom.

the class ApiSiteService method login.

/**
 * 执行用户登陆站点行为
 *
 * @param command
 * @return
 */
public CommandResponse login(Command command) {
    CommandResponse commandResponse = new CommandResponse().setAction(CommandConst.ACTION_RES);
    ErrorCode2 errCode = ErrorCode2.ERROR;
    try {
        ApiSiteLoginProto.ApiSiteLoginRequest loginRequest = ApiSiteLoginProto.ApiSiteLoginRequest.parseFrom(command.getParams());
        String userIdPubk = loginRequest.getUserIdPubk();
        String userIdSignBase64 = loginRequest.getUserIdSignBase64();
        String userDeviceIdPubk = loginRequest.getUserDeviceIdPubk();
        String userDeviceIdSignBase64 = loginRequest.getUserDeviceIdSignBase64();
        String userDeviceName = loginRequest.getUserDeviceName();
        String userToken = loginRequest.getUserToken();
        LogUtils.requestDebugLog(logger, command, loginRequest.toString());
        if (StringUtils.isAnyEmpty(userIdPubk, userIdSignBase64)) {
            errCode = ErrorCode2.ERROR2_LOGGIN_USERID_EMPTY;
            return commandResponse.setErrCode2(errCode);
        }
        if (StringUtils.isAnyEmpty(userDeviceIdPubk, userDeviceIdSignBase64)) {
            errCode = ErrorCode2.ERROR2_LOGGIN_DEVICEID_EMPTY;
            return commandResponse.setErrCode2(errCode);
        }
        // 个人身份公钥,解密Sign签名,解密Key
        PublicKey userPubKey = RSACrypto.getRSAPubKeyFromPem(userIdPubk);
        Signature userSign = Signature.getInstance("SHA512withRSA");
        userSign.initVerify(userPubKey);
        // 原文
        userSign.update(userIdPubk.getBytes());
        boolean userSignResult = userSign.verify(Base64.getDecoder().decode(userIdSignBase64));
        logger.debug("userSignResult={}", userSignResult);
        if (userSignResult) {
            Signature userDeviceSign = Signature.getInstance("SHA512withRSA");
            userDeviceSign.initVerify(userPubKey);
            // 原文
            userDeviceSign.update(userDeviceIdPubk.getBytes());
            userSignResult = userDeviceSign.verify(Base64.getDecoder().decode(userDeviceIdSignBase64));
        }
        logger.debug("deviceSignResult={}", userSignResult);
        // 用户身份校验成功,方可执行登陆操作
        if (userSignResult) {
            // 判断用户,是否已经注册
            SimpleUserBean subean = UserProfileDao.getInstance().getSimpleProfileByPubk(userIdPubk);
            if (subean == null || StringUtils.isEmpty(subean.getUserId())) {
                logger.info("login site: new user need to register before login site");
                // 未注册,告知用户执行注册行为
                errCode = ErrorCode2.ERROR2_LOGGIN_NOREGISTER;
                return commandResponse.setErrCode2(errCode);
            }
            if (subean.getUserStatus() == UserProto.UserStatus.SEALUP_VALUE) {
                logger.info("login site:	 user no permision as seal up");
                // 禁封用户禁止登陆
                errCode = ErrorCode2.ERROR2_LOGGIN_SEALUPUSER;
                return commandResponse.setErrCode2(errCode);
            }
            String siteUserId = subean.getUserId();
            String deviceId = HashCrypto.MD5(userDeviceIdPubk);
            // 保存设备信息
            UserDeviceBean deviceBean = new UserDeviceBean();
            deviceBean.setDeviceId(deviceId);
            deviceBean.setDeviceName(userDeviceName);
            deviceBean.setSiteUserId(siteUserId);
            deviceBean.setUserDevicePubk(userDeviceIdPubk);
            deviceBean.setUserToken(userToken);
            deviceBean.setActiveTime(System.currentTimeMillis());
            deviceBean.setAddTime(System.currentTimeMillis());
            boolean loginResult = SiteLoginDao.getInstance().updateUserDevice(deviceBean);
            if (!loginResult) {
                // 更新失败,则重新保存数据
                loginResult = SiteLoginDao.getInstance().saveUserDevice(deviceBean);
            }
            logger.debug("login site: save device result={} deviceBean={}", loginResult, deviceBean.toString());
            if (loginResult) {
                // 生成session
                String sessionId = UUID.randomUUID().toString();
                UserSessionBean sessionBean = new UserSessionBean();
                sessionBean.setLoginTime(System.currentTimeMillis());
                sessionBean.setSiteUserId(siteUserId);
                sessionBean.setOnline(true);
                sessionBean.setSessionId(sessionId);
                sessionBean.setDeviceId(deviceId);
                // 上次登陆(auth)时间
                sessionBean.setLoginTime(System.currentTimeMillis());
                loginResult = loginResult && SiteLoginDao.getInstance().saveUserSession(sessionBean);
                if (loginResult) {
                    ApiSiteLoginProto.ApiSiteLoginResponse response = ApiSiteLoginProto.ApiSiteLoginResponse.newBuilder().setSiteUserId(siteUserId).setUserSessionId(sessionId).build();
                    commandResponse.setParams(response.toByteArray());
                    errCode = ErrorCode2.SUCCESS;
                } else {
                    errCode = ErrorCode2.ERROR2_LOGGIN_UPDATE_SESSION;
                }
            } else {
                errCode = ErrorCode2.ERROR2_LOGGIN_UPDATE_DEVICE;
            }
        } else {
            errCode = ErrorCode2.ERROR2_LOGGIN_ERRORSIGN;
        }
    } catch (Exception e) {
        errCode = ErrorCode2.ERROR_SYSTEMERROR;
        LogUtils.requestErrorLog(logger, command, e);
    }
    return commandResponse.setErrCode2(errCode);
}
Also used : ApiSiteLoginProto(com.akaxin.proto.site.ApiSiteLoginProto) PublicKey(java.security.PublicKey) UserSessionBean(com.akaxin.site.storage.bean.UserSessionBean) CommandResponse(com.akaxin.common.command.CommandResponse) SimpleUserBean(com.akaxin.site.storage.bean.SimpleUserBean) ErrorCode2(com.akaxin.common.constant.ErrorCode2) UserDeviceBean(com.akaxin.site.storage.bean.UserDeviceBean) Signature(java.security.Signature)

Aggregations

CommandResponse (com.akaxin.common.command.CommandResponse)1 ErrorCode2 (com.akaxin.common.constant.ErrorCode2)1 ApiSiteLoginProto (com.akaxin.proto.site.ApiSiteLoginProto)1 SimpleUserBean (com.akaxin.site.storage.bean.SimpleUserBean)1 UserDeviceBean (com.akaxin.site.storage.bean.UserDeviceBean)1 UserSessionBean (com.akaxin.site.storage.bean.UserSessionBean)1 PublicKey (java.security.PublicKey)1 Signature (java.security.Signature)1