场景:
security模块、system模块;打成一个jar包,security通过shiro进行登录验证;
业务:
第一步:登陆;
第二步:请求security中queryUser()接口,然后queryUser()接口会调用system模块中的某一个类,比如queryLic();
问题:
因为模块之间是通过feign连接的,也就是http请求,所以每一个url都会走security的shiro验证,但是在第二步验证的时候会出现获取不到登陆信息的情况;
解决方法:
feign中可以携带token信息,带上去进行验证;
在security添加配置类:
import javax.servlet.http.HttpServletRequest; /** * 跨模块获取登录信息 * author shichangle * date 2020/2/20 0020 16:11 */ @Configuration public class FeignConfig implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = requestAttributes.getRequest(); requestTemplate.header("postman-token",request.getHeader("postman-token")); requestTemplate.header("cookie",request.getHeader("cookie")); } }
具体shiro认证代码:
//获取当前登陆用户信息
Subject subject = SecurityUtils.getSubject(); String header = ((HttpServletRequest) request).getHeader("Access-Token"); if (!subject.isAuthenticated()) { logger.error("未登录"); return false; }