Эх сурвалжийг харах

Merge branch 'master' of http://62.234.61.92:3000/wjm/mec-cloud_IntelligentManufacturing_CLIENT

lph 1 жил өмнө
parent
commit
e1d6fd6d9a

+ 37 - 1
zkqy-admin/src/main/java/com/zkqy/web/controller/system/SysLoginController.java

@@ -96,6 +96,8 @@ public class SysLoginController {
      */
     @PostMapping("/login")
     public AjaxResult login(@Valid @RequestBody LoginBody loginBody, BindingResult bindingResult) {
+        // 验证当前登录用的账号是否有效
+//        if (loginService.checkLogin(loginBody)) return AjaxResult.error("请合法登录!");
         if (bindingResult.hasErrors()) {
             return AjaxResult.error(bindingResult.getFieldError().getDefaultMessage());
         }
@@ -106,7 +108,41 @@ public class SysLoginController {
             return AjaxResult.error("未有此用户信息");
         }
         // 生成令牌
-        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
+        String token = loginService.login(loginBody.getTenantID() + "¥¥¥" + loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
+                loginBody.getUuid(), true);
+        if (tokenService.getLoginUserIsAdminByToken(token)) {
+            return AjaxResult.error("用户不存在!");
+        }
+        //检查租户过期时间
+        String checkTenantExpirationTimeMsg = loginService.checkTenantExpirationTime(loginBody.getTenantID() + "¥¥¥" + loginBody.getUsername());
+        if (!checkTenantExpirationTimeMsg.isEmpty()) {
+            return AjaxResult.error(checkTenantExpirationTimeMsg);
+        }
+        ajax.put(Constants.TOKEN, token);
+        return ajax;
+    }
+
+    /**
+     * 登录方法
+     *
+     * @param loginBody 登录信息
+     * @return 结果
+     */
+    @PostMapping("/tenantLogin")
+    public AjaxResult tenantLogin(@Valid @RequestBody LoginBody loginBody, BindingResult bindingResult) {
+        // 验证当前登录用的账号是否有效
+//        if (loginService.checkLogin(loginBody)) return AjaxResult.error("请合法登录!");
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(bindingResult.getFieldError().getDefaultMessage());
+        }
+        //校验租户状态?生成token
+        AjaxResult ajax = AjaxResult.success();
+        //校验不能是admin
+        if (loginBody.getUsername().equals("admin")) {
+            return AjaxResult.error("未有此用户信息");
+        }
+        // 生成令牌
+        String token = loginService.tenantLogin(loginBody.getTenantID(), loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
                 loginBody.getUuid(), true);
         if (tokenService.getLoginUserIsAdminByToken(token)) {
             return AjaxResult.error("用户不存在!");

+ 25 - 19
zkqy-common/src/main/java/com/zkqy/common/core/domain/model/LoginBody.java

@@ -5,11 +5,10 @@ import javax.validation.constraints.NotNull;
 
 /**
  * 用户登录对象
- * 
+ *
  * @author ruoyi
  */
-public class LoginBody
-{
+public class LoginBody {
     /**
      * 用户名
      */
@@ -31,48 +30,55 @@ public class LoginBody
     @NotNull(message = "验证码不能为空")
     private String code;
 
+    /**
+     * 租户ID
+     */
+//    @NotBlank(message = "请合法访问!")
+//    @NotNull(message = "请合法访问!")
+    private String tenantID;
+
     /**
      * 唯一标识
      */
     private String uuid;
 
-    public String getUsername()
-    {
+    public String getUsername() {
         return username;
     }
 
-    public void setUsername(String username)
-    {
+    public void setUsername(String username) {
         this.username = username;
     }
 
-    public String getPassword()
-    {
+    public String getPassword() {
         return password;
     }
 
-    public void setPassword(String password)
-    {
+    public void setPassword(String password) {
         this.password = password;
     }
 
-    public String getCode()
-    {
+    public String getCode() {
         return code;
     }
 
-    public void setCode(String code)
-    {
+    public void setCode(String code) {
         this.code = code;
     }
 
-    public String getUuid()
-    {
+    public String getUuid() {
         return uuid;
     }
 
-    public void setUuid(String uuid)
-    {
+    public void setUuid(String uuid) {
         this.uuid = uuid;
     }
+
+    public String getTenantID() {
+        return tenantID;
+    }
+
+    public void setTenantID(String tenantID) {
+        this.tenantID = tenantID;
+    }
 }

+ 23 - 0
zkqy-framework/src/main/java/com/zkqy/framework/tenantLogin/CustomUserAuthenticationToken.java

@@ -0,0 +1,23 @@
+package com.zkqy.framework.tenantLogin;
+
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.GrantedAuthority;
+
+import java.util.Collection;
+
+/**
+ * @author hanzihang
+ * @date 2024/3/18 2:49 PM
+ */
+public class CustomUserAuthenticationToken extends UsernamePasswordAuthenticationToken {
+
+    /**
+     * 租户ID
+     */
+    private String tenantId;
+
+    public CustomUserAuthenticationToken(Object principal, Object credentials, String tenantId) {
+        super(principal, credentials);
+        this.tenantId = tenantId;
+    }
+}

+ 73 - 5
zkqy-framework/src/main/java/com/zkqy/framework/web/service/SysLoginService.java

@@ -6,6 +6,8 @@ import cn.hutool.core.util.CharsetUtil;
 import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
 import cn.hutool.crypto.symmetric.SymmetricCrypto;
 import com.zkqy.common.core.domain.entity.SysTenant;
+import com.zkqy.common.core.domain.model.LoginBody;
+import com.zkqy.framework.tenantLogin.CustomUserAuthenticationToken;
 import com.zkqy.system.service.impl.SysTenantServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.AuthenticationManager;
@@ -63,6 +65,17 @@ public class SysLoginService {
     @Autowired
     private SysTenantServiceImpl sysTenantService;
 
+    /**
+     * 首先验证当前登录的账号是否有效
+     */
+    public boolean checkLogin(LoginBody loginBody) {
+        SysUser sysUser = new SysUser();
+        sysUser.setTenantId(Long.valueOf(loginBody.getTenantID()));
+        sysUser.setUserName(loginBody.getUsername());
+        return userService.selectUserList(sysUser).size() == 0;
+    }
+
+
     /**
      * 登录验证
      *
@@ -72,11 +85,11 @@ public class SysLoginService {
      * @param uuid     唯一标识
      * @return 结果
      */
-    public String login(String username, String password, String code, String uuid,Boolean isValidateCaptcha) {
-       if(isValidateCaptcha){
-           //验证码校验
-           validateCaptcha(username, code, uuid);
-       }
+    public String login(String username, String password, String code, String uuid, Boolean isValidateCaptcha) {
+        if (isValidateCaptcha) {
+            //验证码校验
+            validateCaptcha(username, code, uuid);
+        }
         //登录前置校验
         loginPreCheck(username, password);
 
@@ -114,6 +127,61 @@ public class SysLoginService {
         return tokenService.createToken(loginUser);
     }
 
+
+    /**
+     * 租户登录验证
+     *
+     * @param tenantID 租户ID
+     * @param username 用户名
+     * @param password 密码
+     * @param code     验证码
+     * @param uuid     唯一标识
+     * @return 结果
+     */
+    public String tenantLogin(String tenantID, String username, String password, String code, String uuid, Boolean isValidateCaptcha) {
+        if (isValidateCaptcha) {
+            //验证码校验
+            validateCaptcha(username, code, uuid);
+        }
+        //登录前置校验
+        loginPreCheck(username, password);
+
+        // 用户验证
+        Authentication authentication = null;
+        try {
+            // 自定义
+            CustomUserAuthenticationToken customUserAuthenticationToken = new CustomUserAuthenticationToken(username, password, tenantID);
+            AuthenticationContextHolder.setContext(customUserAuthenticationToken);
+
+            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
+            authentication = authenticationManager.authenticate(customUserAuthenticationToken);
+        } catch (Exception e) {
+            if (e instanceof BadCredentialsException) {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
+                throw new UserPasswordNotMatchException();
+            } else {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
+                throw new ServiceException(e.getMessage());
+            }
+        } finally {
+            AuthenticationContextHolder.clearContext();
+        }
+        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
+        Long tenantId;
+        try {
+            tenantId = loginUser.getTenantId();
+            if (tenantId == null) {
+                tenantId = 0L;// 0L 表示当前是admin(租户信息表id自增「自增id不会从0开始」)
+            }
+        } catch (Exception exception) {
+            tenantId = 0L;  // 0L 表示当前是admin(租户信息表id自增「自增id不会从0开始」)
+        }
+        AsyncManager.me().execute(AsyncFactory.recordLogininfor(tenantId, username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
+        recordLoginInfo(loginUser.getUserId());
+        // 生成token
+        return tokenService.createToken(loginUser);
+    }
+
     /**
      * 校验验证码
      *

+ 16 - 23
zkqy-framework/src/main/java/com/zkqy/framework/web/service/UserDetailsServiceImpl.java

@@ -20,13 +20,12 @@ import com.zkqy.system.service.ISysUserService;
  * @author ruoyi
  */
 @Service
-public class UserDetailsServiceImpl implements UserDetailsService
-{
+public class UserDetailsServiceImpl implements UserDetailsService {
     private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);
 
     @Autowired
     private ISysUserService userService;
-    
+
     @Autowired
     private SysPasswordService passwordService;
 
@@ -34,33 +33,27 @@ public class UserDetailsServiceImpl implements UserDetailsService
     private SysPermissionService permissionService;
 
     @Override
-    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
-    {
+    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+        String name = username.split("¥¥¥")[1];
         SysUser user = userService.selectUserByUserName(username);
-        if (StringUtils.isNull(user))
-        {
-            log.info("登录用户:{} 不存在.", username);
-            throw new ServiceException("登录用户:" + username + " 不存在");
-        }
-        else if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
-        {
-            log.info("登录用户:{} 已被删除.", username);
-            throw new ServiceException("对不起,您的账号:" + username + " 已被删除");
+        if (StringUtils.isNull(user)) {
+            log.info("登录用户:{} 不存在.", name);
+            throw new ServiceException("登录用户:" + name + " 不存在");
+        } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
+            log.info("登录用户:{} 已被删除.", name);
+            throw new ServiceException("对不起,您的账号:" + name + " 已被删除");
+        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+            log.info("登录用户:{} 已被停用.", name);
+            throw new ServiceException("对不起,您的账号:" + name + " 已停用");
         }
-        else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
-        {
-            log.info("登录用户:{} 已被停用.", username);
-            throw new ServiceException("对不起,您的账号:" + username + " 已停用");
-        }
-
         passwordService.validate(user);
-
         return createLoginUser(user);
     }
 
 
-    public UserDetails createLoginUser(SysUser user)
-    {
+    public UserDetails createLoginUser(SysUser user) {
         return new LoginUser(user.getUserId(), user.getDeptId(), user.getTenantId(), user, permissionService.getMenuPermission(user));
     }
+
+
 }

+ 3 - 3
zkqy-system/src/main/java/com/zkqy/system/service/ISysUserService.java

@@ -36,12 +36,12 @@ public interface ISysUserService
     public List<SysUser> selectUnallocatedList(SysUser user);
 
     /**
-     * 通过用户查询用户
+     * 通过用户信息查询用户
      * 
-     * @param userName 用户名
+     * @param userInfo 用户信息
      * @return 用户对象信息
      */
-    public SysUser selectUserByUserName(String userName);
+    public SysUser selectUserByUserName(String userInfo);
 
     /**
      * 通过用户ID查询用户

+ 2 - 2
zkqy-system/src/main/java/com/zkqy/system/service/impl/SysUserServiceImpl.java

@@ -111,8 +111,8 @@ public class SysUserServiceImpl implements ISysUserService {
      * @return 用户对象信息
      */
     @Override
-    public SysUser selectUserByUserName(String userName) {
-        String info[] = userName.split("¥¥¥");
+    public SysUser selectUserByUserName(String userInfo) {
+        String info[] = userInfo.split("¥¥¥");
         return userMapper.selectUserByTenantInfo(info[0], info[1]);
     }
 

+ 1 - 2
zkqy-system/src/main/resources/mapper/system/SysTenantMapper.xml

@@ -73,8 +73,7 @@
     <select id="selectSysTenantByTenantCode" parameterType="string" resultMap="SysTenantResult">
         <include refid="selectSysTenantVo"/>
         and tenant_code = #{tenantCode}
-    </select>
-
+    </select> 
     <select id="selectSysTenantChildrenInfoByTenantId" parameterType="Long" resultMap="SysTenantResult">
         <include refid="selectSysTenantVo"/>
         and tenant_parent_id = #{tenantId}

+ 11 - 0
zkqy-ui/.env.development

@@ -7,6 +7,9 @@ ENV = 'development'
 # 管理系统/开发环境
 VUE_APP_BASE_API = '/dev-api'
 
+# 图片路径
+VUE_APP_BASE_IMG_API = 'http://192.168.110.59:1025/dev-api'
+
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true
 
@@ -15,3 +18,11 @@ VUE_CLI_BABEL_TRANSPILE_MODULES = true
 VUE_APP_BASE_API1 = 'http://192.168.110.59:8066/'
 # VUE_APP_BASE_API1 = 'http://192.168.110.76:8066/'
 
+#数据引擎模块IP
+#VUE_APP_BASE_API2 = 'http://192.168.110.59:8099/'
+
+#表单引擎模块IP
+#VUE_APP_BASE_API3 = 'http://192.168.110.59:8088/'
+
+#流程引擎模块IP
+#VUE_APP_BASE_API4 = 'http://192.168.110.59:8055/'

+ 2 - 1
zkqy-ui/src/api/login.js

@@ -1,11 +1,12 @@
 import request from '@/utils/request'
 
 // 登录方法
-export function login(username, password, code, uuid) {
+export function login(username, password, code, tenantID, uuid) {
   const data = {
     username,
     password,
     code,
+    tenantID,
     uuid
   }
   return request({

+ 10 - 11
zkqy-ui/src/store/modules/user.js

@@ -1,6 +1,6 @@
-import { login, logout, getInfo, adminLoginApi } from '@/api/login'
-import { changeDatasource } from '@/api/dataEngine/index'
-import { getToken, setToken, removeToken } from '@/utils/auth'
+import {login, logout, getInfo, adminLoginApi} from '@/api/login'
+import {changeDatasource} from '@/api/dataEngine/index'
+import {getToken, setToken, removeToken} from '@/utils/auth'
 
 const user = {
   state: {
@@ -47,16 +47,15 @@ const user = {
 
   actions: {
     // 登录
-    Login({ commit }, userInfo) {
+    Login({commit}, userInfo) {
       const username = userInfo.username.trim()
       const password = userInfo.password
-
+      const tenantID = userInfo.tenantID
       const code = userInfo.code
       const uuid = userInfo.uuid
       return new Promise((resolve, reject) => {
-        login(username, password, code, uuid).then(res => {
+        login(username, password, code, tenantID, uuid).then(res => {
           commit('SET_NAME', username)
-
           setToken(res.token)
           commit('SET_TOKEN', res.token)
           resolve()
@@ -66,7 +65,7 @@ const user = {
       })
     },
     // admin登录
-    adminLogin({ commit }, userInfo) {
+    adminLogin({commit}, userInfo) {
       const username = userInfo.username.trim()
       const password = userInfo.password
 
@@ -86,7 +85,7 @@ const user = {
     },
 
     // 获取用户信息
-    GetInfo({ commit, state }) {
+    GetInfo({commit, state}) {
       return new Promise((resolve, reject) => {
         getInfo().then(res => {
           const user = res.user
@@ -116,7 +115,7 @@ const user = {
     },
 
     // 退出系统
-    LogOut({ commit, state }) {
+    LogOut({commit, state}) {
       return new Promise((resolve, reject) => {
         logout(state.token).then(() => {
           commit('SET_TOKEN', '')
@@ -133,7 +132,7 @@ const user = {
     },
 
     // 前端 登出
-    FedLogOut({ commit }) {
+    FedLogOut({commit}) {
       return new Promise(resolve => {
         commit('SET_TOKEN', '')
         removeToken()

+ 21 - 111
zkqy-ui/src/views/login.vue

@@ -86,83 +86,6 @@
         >
       </el-row>
     </el-form>
-
-    <!-- <el-form
-      ref="loginForm"
-      :model="loginForm"
-      :rules="loginRules"
-      class="login-form"
-    >
-      <img src="../assets/images/comp.png" class="comlogo" />
-      <span class="title">智能制造平台</span>
-      <el-form-item prop="username">
-        <p style="line-height: 12px">用户名</p>
-        <el-input
-          v-model="loginForm.username"
-          type="text"
-          auto-complete="off"
-          placeholder="账号"
-          show-password
-        >
-
-        </el-input>
-      </el-form-item>
-      <el-form-item prop="password">
-        <p style="line-height: 12px">密码</p>
-        <el-input
-          v-model="loginForm.password"
-          type="password"
-          auto-complete="off"
-          placeholder="密码"
-          @keyup.enter.native="handleLogin"
-          show-password
-        >
-
-        </el-input>
-      </el-form-item>
-
-      <el-form-item prop="code" v-if="captchaEnabled">
-        <div style="line-height: 12px">验证码</div>
-        <el-input
-          v-model="loginForm.code"
-          auto-complete="off"
-          placeholder="验证码"
-          style="width: 63%"
-          @keyup.enter.native="handleLogin"
-          show-password
-        >
-        </el-input>
-        <div class="login-code">
-          <img :src="codeUrl" @click="getCode" class="login-code-img" />
-        </div>
-      </el-form-item>
-      <el-checkbox
-        v-model="loginForm.rememberMe"
-        class="a"
-        >在这个设备上记住我</el-checkbox
-      >
-
-      <el-form-item >
-        <el-button
-          :loading="loading"
-          size="medium"
-          type="primary"
-          @click.native.prevent="handleLogin"
-        >
-          <span v-if="!loading">登 录</span>
-          <span v-else>登 录 中...</span>
-        </el-button>
-        <div style="float: right" v-if="register">
-          <router-link class="link-type" :to="'/register'"
-            >立即注册</router-link
-          >
-        </div>
-      </el-form-item>
-    </el-form>
-
-    <div class="el-login-footer">
-      <span>Copyright © 2018-2023 zkqy.vip All Rights Reserved.</span>
-    </div> -->
   </div>
 </template>
 
@@ -171,14 +94,11 @@ import {getCodeImg, isTenantExist} from "@/api/login";
 import {changeDatasource} from "@/api/dataEngine";
 import Cookies from "js-cookie";
 import {encrypt, decrypt} from "@/utils/jsencrypt";
-import {getLoginPageConfigurationInfo} from "@/api/system/configuration";
 
 export default {
   name: "Login",
   data() {
     return {
-      // 页面配置信息
-      config: {},
       codeUrl: "",
       tenantId: "",
       loginForm: {
@@ -190,6 +110,7 @@ export default {
         rememberMe: false,
         code: "",
         uuid: "",
+        tenantID: ""
       },
       loginRules: {
         username: [
@@ -224,17 +145,19 @@ export default {
   methods: {
     // 校验url
     validateTenantId() {
-      console.log(this.$route.query);
       let tenantCode = this.$route.query['tenantCode']
-      console.log(tenantCode)
       if (tenantCode != null) {
         // 得到tenantId 查询裤中是否存在该租户
         isTenantExist({tenantCode: tenantCode}).then(res => {
           if (res.data?.tenantId) { // 判断当前编号是否存在库中
-            console.log(res)
-            this.tenantId = res.data.tenantId
+
+            this.tenantId = res.data.tenantId;
+            this.loginForm.tenantID = this.tenantId;
+
             // 得到租户的信息
             this.config = res.data.loginPageConfiguration
+            this.setConfig();
+
             // 如果当前租户没有配置登录页面则不可访问
             if (this.config == null && this.config == undefined) {
               // this.$router.push({path: "/404"})
@@ -263,21 +186,27 @@ export default {
         windowTitle,
         windowLogo,
       } = this.config;
+
       // 设置背景图
       if (loginPageBackgroundImage) {
         let loginBgDom = document.getElementsByClassName("login");
         if (loginBgDom.length > 0) {
           loginBgDom[0].style.backgroundImage = `url(${
-            process.env.VUE_APP_BASE_API + loginPageBackgroundImage
+            process.env.VUE_APP_BASE_IMG_API + loginPageBackgroundImage
           })`;
+
+          console.log("" + `url(${
+            process.env.VUE_APP_BASE_IMG_API + loginPageBackgroundImage
+          })`)
         }
       }
+
       // 设置logo
       if (loginPageLogo) {
         let loginLogoDom = document.getElementsByClassName("comlogo");
         if (loginLogoDom.length > 0) {
           loginLogoDom[0].style.backgroundImage = `url(${
-            process.env.VUE_APP_BASE_API + loginPageLogo
+            process.env.VUE_APP_BASE_IMG_API + loginPageLogo
           })`;
         }
         window.sessionStorage.setItem("logo", loginPageLogo);
@@ -316,28 +245,6 @@ export default {
       //   document.head.appendChild(link);
       // }
     },
-    // 获取登录页配置信息
-    async getConfig() {
-      let query = this.$route.query.tenantId;
-      try {
-        let res = await getLoginPageConfigurationInfo(query);
-        if (res.code === 200) {
-          if (res.data) {
-            this.config = res.data;
-            this.setConfig();
-          } else {
-            // this.$router.push("/404");
-            this.$message.error("获取页面信息失败,请检查url中的tenantId");
-          }
-        } else {
-          this.$message.error("获取页面信息失败,请检查tenantId");
-        }
-      } catch (error) {
-        this.$message.error("获取页面信息失败,请检查tenantId");
-      }
-    },
-    forgetEvent() {
-    },
     getCode() {
       getCodeImg().then((res) => {
         this.captchaEnabled =
@@ -359,6 +266,7 @@ export default {
         rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
       };
     },
+
     handleLogin() {
       this.$refs.loginForm.validate((valid) => {
         if (valid) {
@@ -376,9 +284,11 @@ export default {
             Cookies.remove("password");
             Cookies.remove("rememberMe");
           }
-          console.log(this.loginForm)
-          this.loginForm.username = this.tenantId + '¥¥¥' + this.loginForm.username;
-          this.$store.dispatch("Login", this.loginForm).then(() => {
+          let form = {
+            ...this.loginForm,
+            tenantID: this.tenantId
+          }
+          this.$store.dispatch("Login", form).then(() => {
             changeDatasource(); //切换数据源
             this.$router.push({path: this.redirect || "/"}).catch(() => {
             });