孙超林 2 nedēļas atpakaļ
vecāks
revīzija
109b9e28ce

+ 58 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java

@@ -1,5 +1,7 @@
 package com.ruoyi.web.controller.system;
 
+import java.security.spec.AlgorithmParameterSpec;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
@@ -7,7 +9,10 @@ import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.ruoyi.common.config.WxAppConfig;
 import com.ruoyi.common.core.domain.model.WxLoginBody;
-import org.apache.logging.log4j.LogManager;
+
+
+import com.ruoyi.common.utils.StringUtils;
+import org.apache.commons.codec.binary.Base64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,6 +33,10 @@ import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.service.ISysMenuService;
 import org.springframework.web.client.RestTemplate;
 
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
 
 /**
  * 登录验证
@@ -132,13 +141,59 @@ public class SysLoginController
         //解密
         String decryptResult="";
         try {
-//            decryptResult=decrypt(session_key,encryptedIv,encryptedData);
+            decryptResult=decrypt(session_key,encryptedIv,encryptedData);
         }catch (Exception e){
             e.printStackTrace();
             return AjaxResult.error("微信登录失败");
         }
-        return AjaxResult.success();
+        if (StringUtils.hasText(decryptResult)){
+            //如果解析成功,获取token
+            String token=loginService.wxLogin(decryptResult);
+            AjaxResult ajax=AjaxResult.success();
+            ajax.put(Constants.TOKEN,token);
+            return ajax;
+        }else {
+            return AjaxResult.error("微信登录失败");
+        }
+//        return AjaxResult.success();
+
 
+    }
 
+    private String decrypt(String session_key, String encryptedIv, String encryptedData) throws Exception {
+        //转化为字节数组
+        byte[] key = Base64.decodeBase64(session_key);
+        byte[] iv = Base64.decodeBase64(encryptedIv);
+        byte[] encData = Base64.decodeBase64(encryptedData);
+        //如果密钥不足16位,那么就补足
+        int base = 16;
+        if (key.length % base != 0){
+            int groups = key.length / base + (key.length % base != 0 ? 1 : 0);
+            byte[] temp = new byte[groups * base];
+            Arrays.fill(temp, (byte) 0);
+            System.arraycopy(key, 0, temp, 0, key.length);
+            key = temp;
+        }
+        //如果初始向量不足16位,也补足
+        if (iv.length % base != 0){
+            int groups = iv.length / base + (iv.length % base != 0 ? 1 : 0);
+            byte[] temp = new byte[groups * base];
+            Arrays.fill(temp, (byte) 0);
+            System.arraycopy(iv, 0, temp, 0, iv.length);
+            iv = temp;
+        }
+        AlgorithmParameterSpec ivSpec=new IvParameterSpec(iv);
+        String resultStr=null;
+        try {
+            Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding");
+            SecretKeySpec keySpec=new SecretKeySpec(key, "AES");
+            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
+            resultStr=new String(cipher.doFinal(encData),"UTF-8");
+        }catch (Exception e){
+            logger.info("解析错误!");
+            e.printStackTrace();
+        }
+        //解析解密后的字符串
+        return resultStr;
     }
 }

+ 1 - 1
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

@@ -111,7 +111,7 @@ public class SecurityConfig
             .authorizeHttpRequests((requests) -> {
                 permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
-                requests.antMatchers("/login", "/register", "/captchaImage").permitAll()
+                requests.antMatchers("/login","wxLogin","/register", "/captchaImage").permitAll()
                     // 静态资源,可匿名访问
                     .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                     .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()

+ 8 - 8
ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java

@@ -130,14 +130,14 @@ public class Server
         long[] prevTicks = processor.getSystemCpuLoadTicks();
         Util.sleep(OSHI_WAIT_SECOND);
         long[] ticks = processor.getSystemCpuLoadTicks();
-        long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()];
-        long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()];
-        long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()];
-        long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()];
-        long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()];
-        long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()];
-        long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()];
-        long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()];
+        long nice = ticks[TickType.NICE.ordinal()] - prevTicks[TickType.NICE.ordinal()];
+        long irq = ticks[TickType.IRQ.ordinal()] - prevTicks[TickType.IRQ.ordinal()];
+        long softirq = ticks[TickType.SOFTIRQ.ordinal()] - prevTicks[TickType.SOFTIRQ.ordinal()];
+        long steal = ticks[TickType.STEAL.ordinal()] - prevTicks[TickType.STEAL.ordinal()];
+        long cSys = ticks[TickType.SYSTEM.ordinal()] - prevTicks[TickType.SYSTEM.ordinal()];
+        long user = ticks[TickType.USER.ordinal()] - prevTicks[TickType.USER.ordinal()];
+        long iowait = ticks[TickType.IOWAIT.ordinal()] - prevTicks[TickType.IOWAIT.ordinal()];
+        long idle = ticks[TickType.IDLE.ordinal()] - prevTicks[TickType.IDLE.ordinal()];
         long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
         cpu.setCpuNum(processor.getLogicalProcessorCount());
         cpu.setTotal(totalCpu);

+ 38 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java

@@ -1,6 +1,10 @@
 package com.ruoyi.framework.web.service;
 
 import javax.annotation.Resource;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.system.mapper.SysUserMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.BadCredentialsException;
@@ -51,6 +55,40 @@ public class SysLoginService
 
     @Autowired
     private ISysConfigService configService;
+    @Resource
+    private SysUserMapper userMapper;
+
+    public String wxLogin(String decryptResult) {
+        //字符串转json
+        JSONObject jsonObject = JSONObject.parseObject(decryptResult);
+        String openId = jsonObject.getString("openid");
+        String nickName = jsonObject.getString("nickName");
+        String avatarUrl = jsonObject.getString("avatarUrl");
+        SysUser wxUser = userMapper.selectWxUserByOpenId(openId);
+        SysUser user= new SysUser();
+        if (wxUser == null) {
+            user.setUserName(IdUtils.fastSimpleUUID());
+            user.setNickName(nickName);
+            user.setAvatar(avatarUrl);
+            user.setOpenId(openId);
+            user.setCreateTime(DateUtils.getNowDate());
+            userMapper.insertUser(user);
+        }else {
+            user=wxUser;
+            user.setNickName(nickName);
+            user.setAvatar(avatarUrl);
+            user.setUpdateTime(DateUtils.getNowDate());
+            userMapper.updateUser(user);
+        }
+        //组装token信息
+        LoginUser loginUser=new LoginUser();
+        loginUser.setOpenId(openId);
+        //如果有的话设置
+        loginUser.setUser(user);
+        loginUser.setUserId(user.getUserId());
+        //生成token
+        return tokenService.createToken(loginUser);
+    }
 
     /**
      * 登录验证

+ 4 - 7
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java

@@ -65,17 +65,14 @@ public class SysPermissionService
         else
         {
             List<SysRole> roles = user.getRoles();
-            if (!CollectionUtils.isEmpty(roles))
+            if (!CollectionUtils.isEmpty(roles) && roles.size() > 1)
             {
                 // 多角色设置permissions属性,以便数据权限匹配权限
                 for (SysRole role : roles)
                 {
-                    if (StringUtils.equals(role.getStatus(), UserConstants.ROLE_NORMAL) && !role.isAdmin())
-                    {
-                        Set<String> rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId());
-                        role.setPermissions(rolePerms);
-                        perms.addAll(rolePerms);
-                    }
+                    Set<String> rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId());
+                    role.setPermissions(rolePerms);
+                    perms.addAll(rolePerms);
                 }
             }
             else