本文目录导读:

- 后端中间件/过滤器拦截(最推荐,安全性最高)
- 路由守卫(前端SPA应用)
- 配置Nginx/Apache反向代理级拦截(性能最佳)
- 全局错误处理 + HTTP状态码拦截(增强体验)
- 安全增强技巧(防止绕过)
- 最佳实践建议
针对“后台未授权拦截”这个问题,通常指的是用户未登录或会话已过期时,访问受保护的后台页面(如 /admin、/dashboard)时,系统应如何自动拦截并重定向。
以下是从前端、后端到中间件的几种主流拦截方案,按推荐程度排序:
后端中间件/过滤器拦截(最推荐,安全性最高)
这是最根本的拦截方式,无论前端如何操作,只要请求到达后端,就会被拦截。
实现原理(以Java Spring Boot为例)
// 自定义拦截器
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// 1. 检查Session或Token
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("user") == null) {
// 2. 未授权 -> 重定向到登录页
response.sendRedirect("/login");
return false; // 拦截后续处理
}
return true; // 放行
}
}
// 配置拦截路径(只拦截/admin下的请求)
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/admin/**") // 只拦截后台
.excludePathPatterns("/login", "/static/**");
}
}
其他语言类似:Node.js使用Express中间件、Python使用Django装饰器、PHP使用框架中间件。
路由守卫(前端SPA应用)
适用于Vue/React等单页应用。注意:前端拦截只能防小白用户,防不住抓包篡改,必须配合后端。
Vue Router 示例
// router/index.js
router.beforeEach((to, from, next) => {
// 假设token存在localStorage
const token = localStorage.getItem('token');
// 如果访问后台路径且没有token
if (to.path.startsWith('/admin') && !token) {
next('/login'); // 重定向到登录页
} else {
next(); // 放行
}
});
React Router 示例
function PrivateRoute({ children }) {
const token = localStorage.getItem('token');
if (!token) {
return <Navigate to="/login" replace />;
}
return children;
}
// 使用
<Route path="/admin/*" element={
<PrivateRoute>
<AdminLayout />
</PrivateRoute>
} />
配置Nginx/Apache反向代理级拦截(性能最佳)
如果前端和后端分离,可以在网关层直接拦截未授权的请求,减少后端压力。
Nginx 示例(校验Token或Cookie)
location /admin {
# 如果请求头中没有X-Auth-Token,直接返回401
if ($http_x_auth_token = "") {
return 302 /login; # 或返回401
}
# 非admin角色的IP限制(可选)
allow 192.168.1.0/24;
deny all;
proxy_pass http://backend_server;
}
缺点:Nginx的if语句处理复杂逻辑困难,通常更适合简单的IP白名单或基础校验,复杂鉴权仍需后端。
全局错误处理 + HTTP状态码拦截(增强体验)
结合后端中间件,当检测到未授权时,返回特定状态码,前端根据状态码统一跳转。
后端返回
// 而不是直接重定向,返回JSON
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public class UnauthorizedException extends RuntimeException {}
// 全局异常处理
@ExceptionHandler(UnauthorizedException.class)
public Result handleUnauthorized() {
return Result.error(401, "请先登录");
}
前端统一处理(axios拦截器)
// axios 响应拦截
axios.interceptors.response.use(
response => response,
error => {
if (error.response.status === 401) {
localStorage.removeItem('token');
window.location.href = '/login'; // 强制跳转
}
return Promise.reject(error);
}
);
安全增强技巧(防止绕过)
- 禁止直接IP访问后台:在服务器配置中只允许域名访问后台路径。
- 双重校验:前端守卫 + 后端中间件,两者都不可少。
- CSRF保护:如果是Cookie+Session模式,需添加CSRF Token防止跨站请求伪造。
- Token定期刷新:设置短时效的Access Token + 长时效的Refresh Token。
- 白名单+黑名单结合:
/admin/login放行,其余/admin/*都需要校验。
最佳实践建议
| 场景 | 推荐方案 |
|---|---|
| 传统多页应用(MVC) | 后端拦截器 + 过滤器 |
| 单页应用(Vue/React) | 前端路由守卫 + 后端API拦截 |
| 高并发/微服务 | Nginx校验 + 后端JWT验证 |
| 所有场景必做 | 后端中间件(这是底线) |
核心原则:永远不要信任前端发来的请求,后端必须自己做一遍权限验证。