SpringBoot整合IP白名单注解实现API安全

小坏说Java
新星创作者: 后端开发技术领域
2024-09-21 20:45:31

1、过滤器配置

package com.cloud.xx.common.config;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cloud.xx.common.entity.DataClient;
import com.cloud.xx.mapper.DataClientMapper;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.List;

@Component
public class IPWhitelistInterceptor implements HandlerInterceptor {

    @Autowired
    private DataClientMapper repository;

    @Override
    public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) throws Exception {


        if (handler instanceof HandlerMethod handlerMethod) {

            //原始handler
            //HandlerMethod handlerMethod = (HandlerMethod) handler;

            IPWhitelist ipWhitelist = handlerMethod.getMethodAnnotation(IPWhitelist.class);
            if (ipWhitelist != null) {
                String ip = request.getRemoteAddr();

                List<String> collect = repository.selectList(new LambdaQueryWrapper<DataClient>().eq(DataClient::getClientIp, ip)).stream().map(DataClient::getClientIp).toList();

                if (!collect.contains(ip)) {
                    response.setContentType("application/json;charset=UTF-8");
                    response.setCharacterEncoding("UTF-8");

                    response.getWriter().write(
                            """
                                    {
                                        "msg": "请开通权限!",
                                        "code": "403"
                                    }
                                    """
                            );

                    response.setStatus(HttpServletResponse.SC_FORBIDDEN);
                    return false;
                }
            }
        }
        return true;
    }

}

 

2、注入拦截器配置

package com.cloud.xx.common.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private IPWhitelistInterceptor ipWhitelistInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(ipWhitelistInterceptor);
    }
}

 

3、自定义注解配置

package com.cloud.xx.common.config;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IPWhitelist {
}

4、测试API接口

@RestController
@RequestMapping("/data/tg")
public class TongController {


    /**
     * 配置接口
     * @return
     */

    @PostMapping("ok")
    @IPWhitelist
    public R ok() {

        return R.ok("ok");
    }
}

5、效果

 

...全文
176 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

2

社区成员

发帖
与我相关
我的任务
社区描述
熟悉各种微服务架构、一个菜鸟级别的后端小白、啥时候月薪过万呀、让你学习不在发愁的网站:https://www.e404e.cn
社区管理员
  • 小坏说Java
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧