1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| package com.example.demo.config;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
// 权限过滤器
@WebFilter(urlPatterns = "/*")
public class PermissionFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 将 ServletRequest 和 ServletResponse 转换为 HttpServletRequest 和 HttpServletResponse
// 这样可以使用 HTTP 协议特有的方法
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
// 模拟从请求中获取用户角色
// 这里假设用户角色已经在会话中,并用于后续的权限检查
String userRole = (String) httpRequest.getSession().getAttribute("userRole");
// 模拟需要 ADMIN 角色才能访问的路径
// 如果请求的路径以 "/admin/" 开头,检查用户角色是否为 ADMIN
// 如果不是 ADMIN 角色,返回 403 错误,表示用户没有访问权限
if (httpRequest.getRequestURI().startsWith("/admin/")) {
if (!"ADMIN".equals(userRole)) {
httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "You don't have permission to access this resource.");
return;
}
}
// 如果用户有权限或者请求的资源不需要权限,继续执行链中的下一个过滤器或目标资源
chain.doFilter(request, response);
}
}
|