在博主 newbee-mall-pro 这个项目中提供了线上演示站点,演示用户按照提供的后台用户账号/密码可以登录到管理后台,用户登录后台可以查看后台数据,但是不能让用户可以修改、删除、新增数据。为了在已有项目基础上达到这个要求而不失简洁,博主决定基于 Spring
得拦截器实现了的线上演示站点得只能查看不可操作得要求,当前环境说明如下:
Spring boot
版本 3.0.2- 演示项目地址:https://github.com/wayn111/newbee-mall-pro
一、 新建演示站点拦截器
新建一个 AdminViewModelInterceptor
类实现 HandlerInterceptor
接口,并重写 preHandle
方法,判断 viewModel
为 true
就使用 ajax
返回 请下载项目源代码,演示模式无法修改!
得响应信息。
/**
* 演示模式拦截器
*/
public class AdminViewModelInterceptor implements HandlerInterceptor {
private final boolean viewModel;
public AdminViewModelInterceptor(boolean viewModel) {
this.viewModel = viewModel;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
if (viewModel) {
ServletUtil.renderString(response, JSONObject.toJSONString(R.error("请下载项目源代码,演示模式无法修改!")));
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
二、添加WebConfig配置类
新建一个 WebConfig
类实现 WebMvcConfigurer
接口,重写 addInterceptors()
方法将我们自己得AdminViewModelInterceptor
拦截器注册到 Spring
中,使用 addPathPatterns()
指定拦截路径,使用 excludePathPatterns()
指定哪些路径不需要拦截。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Value("${wayn.viewModel}")
private boolean viewModel;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 后台演示模式拦截器
registry.addInterceptor(new AdminViewModelInterceptor(viewModel))
.addPathPatterns("/admin/**")
.excludePathPatterns("/admin/login").excludePathPatterns("/admin")
.excludePathPatterns("/admin/statistics").excludePathPatterns("/admin/goods")
.excludePathPatterns("/admin/goods/add").excludePathPatterns("/admin/goods/edit/*")
.excludePathPatterns("/admin/goods/list").excludePathPatterns("/admin/users")
.excludePathPatterns("/admin/users/list").excludePathPatterns("/admin/carousels")
.excludePathPatterns("/admin/carousels/list").excludePathPatterns("/admin/indexConfigs")
.excludePathPatterns("/admin/indexConfigs/list").excludePathPatterns("/admin/categories")
.excludePathPatterns("/admin/categories/list").excludePathPatterns("/admin/orders")
.excludePathPatterns("/admin/categories/listForSelect").excludePathPatterns("/admin/orders")
.excludePathPatterns("/admin/orders/list").excludePathPatterns("/admin/coupon")
.excludePathPatterns("/admin/coupon/list").excludePathPatterns("/admin/seckill")
.excludePathPatterns("/admin/seckill/list").excludePathPatterns("/admin/profile")
.excludePathPatterns("/admin/logout").excludePathPatterns("/admin/dist/**")
.excludePathPatterns("/admin/plugins/**");
}
}
如上代码展示,我们指定了管理后台请求路径中一定包含得 /admin
前缀作为指定拦截路径,这样就会拦截后台全部请求,然后再排除路径中,排除掉我们希望用户可以看到的列表数据请求路径,这样就实现了线上演示站点只能查看不能操作得需求。
三、配置文件使用环境变量
第二步中,我们将 viewModel
传给了 AdminViewModelInterceptor
内部,为 true
就不让用户进行操作,为 false
则放过请求。我们在本地开发时,会将 viewModel
设置为 true
方便开发,再部署到演示站点上时,会将 viewModel
设置 false
,不让用户进行操作。「再实际开发中,博主是不希望在部署到演示站点上时还需要修改配置文件的,如果由于人为忘记修改会导致演示站点被人修改,那会造成脏数据问题,于是博主决定在配置文件中使用环境变量来达到不修改配置文件的要求。」 配置如下:
# wayn配置
wayn:
# 读取环境变量WAYN_VIEW_MODEL作为viewModel的结果,如果没有这个变量默认为false
viewModel: ${WAYN_VIEW_MODEL:false}
四、总结
其实为了实现线上演示站点只能查看不可操作得要求,还有很多别的方式,比如在一个包含 rbac 权限管理的后台项目中我们只需要配置用户对菜单按钮访问权限也能达到这个要求。