123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- package com.zhentao.web.controller.system;
- import com.alibaba.fastjson2.JSON;
- import com.alibaba.fastjson2.JSONObject;
- import com.zhentao.common.config.WxAppConfig;
- import com.zhentao.common.constant.Constants;
- import com.zhentao.common.core.domain.AjaxResult;
- import com.zhentao.common.core.domain.entity.SysMenu;
- import com.zhentao.common.core.domain.entity.SysUser;
- import com.zhentao.common.core.domain.model.LoginBody;
- import com.zhentao.common.core.domain.model.LoginUser;
- import com.zhentao.common.core.domain.model.WxLoginBody;
- import com.zhentao.common.utils.SecurityUtils;
- import com.zhentao.common.utils.StringUtils;
- import com.zhentao.common.utils.sign.Base64;
- import com.zhentao.framework.web.service.SysLoginService;
- import com.zhentao.framework.web.service.SysPermissionService;
- import com.zhentao.framework.web.service.TokenService;
- import com.zhentao.system.service.ISysMenuService;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.PostMapping;
- import org.springframework.web.bind.annotation.RequestBody;
- import org.springframework.web.bind.annotation.RestController;
- import org.springframework.web.client.RestTemplate;
- import javax.crypto.Cipher;
- import javax.crypto.spec.IvParameterSpec;
- import javax.crypto.spec.SecretKeySpec;
- import java.security.spec.AlgorithmParameterSpec;
- import java.util.Arrays;
- import java.util.List;
- import java.util.Set;
- /**
- * 登录验证
- *
- * @author ruoyi
- */
- @RestController
- public class SysLoginController
- {
- @Autowired
- private SysLoginService loginService;
- @Autowired
- private ISysMenuService menuService;
- @Autowired
- private SysPermissionService permissionService;
- @Autowired
- private TokenService tokenService;
- @Autowired
- private RestTemplate restTemplate;
- @Autowired
- private WxAppConfig wxAppConfig;
- private static final Logger logger = LoggerFactory.getLogger(SysLoginController.class);
- @PostMapping("/wxLogin")
- public AjaxResult wxLogin(@RequestBody WxLoginBody wxLoginBody){
- logger.info("登录参数: " + JSON.toJSONString(wxLoginBody));
- // 获取登录凭证, 只能用一次
- String code = wxLoginBody.getCode();
- // 密钥
- String encryptedIv = wxLoginBody.getEncryptedIv();
- // 加密数据
- String encryptedData = wxLoginBody.getEncryptedData();
- // 向微信服务器发送请求获取用户信息
- String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + wxAppConfig.getAppId() +
- "&secret=" + wxAppConfig.getAppSecret() + "&js_code=" + code + "&grant_type=authorization_code";
- String res = restTemplate.getForObject(url, String.class);
- JSONObject jsonObject = JSONObject.parseObject(res);
- // 获取session_key和openid
- String sessionKey = jsonObject.getString("session_key");
- String openid = jsonObject.getString("openid");
- // 解密
- String decryptResult = "";
- // 如果没有绑定微信开发平台, 解析结果是没有unionid的
- try {
- decryptResult = decrypt(sessionKey, encryptedIv, encryptedData);
- } catch (Exception e) {
- e.printStackTrace();
- return AjaxResult.error("微信登录失败");
- }
- 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("微信登录失败");
- }
- }
- /**
- * AES解密
- * @param sessionKey
- * @param encryptedIv
- * @param encryptedData
- * @return
- * @throws Exception
- */
- private String decrypt(String sessionKey, String encryptedIv, String encryptedData) throws Exception {
- // 转化为字节数组
- byte[] key = Base64.decode(sessionKey);
- byte[] iv = Base64.decode(encryptedIv);
- byte[] encData = Base64.decode(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;
- }
- /**
- * 登录方法
- *
- * @param loginBody 登录信息
- * @return 结果
- */
- @PostMapping("/login")
- public AjaxResult login(@RequestBody LoginBody loginBody)
- {
- AjaxResult ajax = AjaxResult.success();
- // 生成令牌
- String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
- loginBody.getUuid());
- ajax.put(Constants.TOKEN, token);
- return ajax;
- }
- /**
- * 获取用户信息
- *
- * @return 用户信息
- */
- @GetMapping("getInfo")
- public AjaxResult getInfo()
- {
- LoginUser loginUser = SecurityUtils.getLoginUser();
- if (loginUser == null) {
- return AjaxResult.error("未获取到登录用户信息");
- }
- SysUser user = loginUser.getUser();
- // 角色集合
- Set<String> roles = permissionService.getRolePermission(user);
- // 权限集合
- Set<String> permissions = permissionService.getMenuPermission(user);
- if (loginUser.getPermissions() != null && !loginUser.getPermissions().equals(permissions))
- {
- loginUser.setPermissions(permissions);
- tokenService.refreshToken(loginUser);
- }
- AjaxResult ajax = AjaxResult.success();
- ajax.put("user", user);
- ajax.put("roles", roles);
- ajax.put("permissions", permissions);
- return ajax;
- }
- /**
- * 获取路由信息
- *
- * @return 路由信息
- */
- @GetMapping("getRouters")
- public AjaxResult getRouters()
- {
- Long userId = SecurityUtils.getUserId();
- List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
- return AjaxResult.success(menuService.buildMenus(menus));
- }
- }
|