1、权限过滤器

项目中创建PermissionFilter类

 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);
    }
}