magic 您所在的位置:网站首页 天香国色意思 magic

magic

#magic| 来源: 网络整理| 查看: 265

对于还没有集成magic-api的小伙伴可以先看我这篇文章

ruoyi-vue快速集成magic-api_windcore的博客-CSDN博客

正文:

        单独使用ruoyi的小伙伴们想必知道可以通过SecurityUtils或TokenService来获取到用户登录信息,但与magic-api结合后,在magic-api直接引用这两者的话是无法正常执行的,主要原因是这两者都是通过从HttpRequest流中获取header中的Authorization来解析的,而magic-api 中使用import 导入SecurityUtils或TokenService,在调用时无法传递http流,所以就会报401错啦。

改造思路:

        我们可以在magic-api获取到Authorization信息,然后在TokenService类中加个公共方法,直接解析Authorization,从而获得LoginUser。

解决办法 1、复制以下代码

(注意更换为你的package),替换你的TokenService(位置在xxx.framework.web.service下)

package com.shelter.framework.web.service; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import com.shelter.common.constant.Constants; import com.shelter.common.core.domain.model.LoginUser; import com.shelter.common.core.redis.RedisCache; import com.shelter.common.utils.ServletUtils; import com.shelter.common.utils.StringUtils; import com.shelter.common.utils.ip.AddressUtils; import com.shelter.common.utils.ip.IpUtils; import com.shelter.common.utils.uuid.IdUtils; import eu.bitwalker.useragentutils.UserAgent; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; /** * token验证处理 * * @author windcore */ @Component public class TokenService { // 令牌自定义标识 @Value("${token.header}") private String header; // 令牌秘钥 @Value("${token.secret}") private String secret; // 令牌有效期(默认30分钟) @Value("${token.expireTime}") private int expireTime; protected static final long MILLIS_SECOND = 1000; protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; @Autowired private RedisCache redisCache; /** * 获取用户身份信息 * * @return 用户信息 */ public LoginUser getLoginUser(HttpServletRequest request) { // 获取请求携带的令牌 String token = getToken(request); return getLoginUserFromRedis(token); } /** * 加这个方法即可 * * @return 用户信息 */ public LoginUser getLoginUser(String authorization ) { // 获取请求携带的令牌 String token = getToken(authorization); return getLoginUserFromRedis(token); } private LoginUser getLoginUserFromRedis(String token) { if (StringUtils.isNotEmpty(token)) { try { Claims claims = parseToken(token); // 解析对应的权限以及用户信息 String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); String userKey = getTokenKey(uuid); LoginUser user = redisCache.getCacheObject(userKey); return user; } catch (Exception e) { } } return null; } /** * 设置用户身份信息 */ public void setLoginUser(LoginUser loginUser) { if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) { refreshToken(loginUser); } } /** * 删除用户身份信息 */ public void delLoginUser(String token) { if (StringUtils.isNotEmpty(token)) { String userKey = getTokenKey(token); redisCache.deleteObject(userKey); } } /** * 创建令牌 * * @param loginUser 用户信息 * @return 令牌 */ public String createToken(LoginUser loginUser) { String token = IdUtils.fastUUID(); loginUser.setToken(token); setUserAgent(loginUser); refreshToken(loginUser); Map claims = new HashMap(); claims.put(Constants.LOGIN_USER_KEY, token); return createToken(claims); } /** * 验证令牌有效期,相差不足20分钟,自动刷新缓存 * * @param loginUser * @return 令牌 */ public void verifyToken(LoginUser loginUser) { long expireTime = loginUser.getExpireTime(); long currentTime = System.currentTimeMillis(); if (expireTime - currentTime


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有