将系统的登录拦截器分成后台管理系统和小程序两个独立的拦截器,实现不同的认证策略。
jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/AppletJwtFilter.java
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
try {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String requestPath = httpRequest.getServletPath();
// 只处理以/applet开头的请求
if (!requestPath.startsWith("/applet")) {
return true; // 不是applet请求,直接放行
}
// 判断当前路径是不是注解了@IngoreAuth路径,如果是,则放开验证
if (InMemoryIgnoreAuth.contains(requestPath)) {
return true;
}
executeLogin(request, response);
return true;
} catch (Exception e) {
JwtUtil.responseError(response,401,CommonConstant.TOKEN_IS_INVALID_MSG);
return false;
}
}
jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
// 添加自己的过滤器并且取名为jwt和applet
Map<String, Filter> filterMap = new HashMap<String, Filter>(2);
//如果cloudServer为空 则说明是单体 需要加载跨域配置【微服务跨域切换】
Object cloudServer = env.getProperty(CommonConstant.CLOUD_SERVER_KEY);
filterMap.put("jwt", new JwtFilter(cloudServer==null));
filterMap.put("applet", new AppletJwtFilter(cloudServer==null));
shiroFilterFactoryBean.setFilters(filterMap);
// <!-- 过滤链定义,从上向下顺序执行
// applet专用过滤器,只处理/applet开头的请求
filterChainDefinitionMap.put("/applet/**", "applet");
// 其他请求使用jwt过滤器
filterChainDefinitionMap.put("/**", "jwt");
/applet/**
之外的所有请求/applet/**
开头的请求@IgnoreAuth
注解的免登录接口@GetMapping("/health")
@IgnoreAuth
@Operation(summary = "健康检查", description = "检查健康管理小程序模块运行状态")
public Result<String> health() {
return Result.OK("健康管理小程序模块运行正常");
}
@GetMapping("/user/info")
@Operation(summary = "获取用户信息", description = "获取小程序用户信息")
public Result<UserInfo> getUserInfo() {
// 需要登录才能访问
return Result.OK(userInfo);
}
@GetMapping("/sys/user/list")
@Operation(summary = "用户列表", description = "获取后台用户列表")
public Result<IPage<SysUser>> getUserList() {
// 使用标准的后台认证
return Result.OK(userList);
}
/applet/**
必须在 /**
之前配置小程序接口:
/applet/health/health
应该能正常访问(有@IgnoreAuth注解)/applet/user/info
需要Token认证后台接口:
/sys/user/list
需要Token认证/sys/login
不需要认证(在anon列表中)Swagger文档:
/applet
开头的接口