Java免登白名单机制是一种安全策略,旨在限制Java应用程序在执行时访问系统资源和网络的能力。通过创建一个白名单,开发者可以明确指定哪些Java类和方法被允许执行,从而降低恶意代码对系统的潜在风险。这种机制通常通过安全管理器(SecurityManager)实现,它可以对Java应用程序的运行时行为进行监控和控制。开发者可以在安全管理器中配置白名单,确保只有经过验证的代码才能访问敏感资源。这样,即使Java应用程序被恶意攻击,也能在一定程度上保护系统安全。
在项目中,我们封装了一个 @IgnoreAuth
注解,源代码如下。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IgnoreAuth {
}
对于项目的所有请求,首先判断是否为接口方法,如果是接口方法则判断是否加了 @IgnoreAuth
注解,源代码如下。
IgnoreAuth annotation;
if (handler instanceof HandlerMethod) {
annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
} else {
return true;
}
如果加了则放行,不加则继续判断 Token 值,源代码如下。
//从header中获取token
String token = request.getHeader(LOGIN_TOKEN_KEY);
/**
* 不需要验证权限的方法直接放过
*/
if(annotation!=null) {
return true;
}
TokenEntity tokenEntity = null;
if(StringUtils.isNotBlank(token)) {
tokenEntity = tokenService.getTokenEntity(token);
}
// ......
运行后端项目后,首先可以先访问一个没有添加 @IgnoreAuth
注解的接口,如下图所示。
http://localhost:8080/springbootrd362/banjileixing/lists
/**
* 列表
*/
@RequestMapping("/lists")
public R list( BanjileixingEntity banjileixing){
EntityWrapper<BanjileixingEntity> ew = new EntityWrapper<BanjileixingEntity>();
ew.allEq(MPUtil.allEQMapPre( banjileixing, "banjileixing"));
return R.ok().put("data", banjileixingService.selectListView(ew));
}
接着我们添加 @IgnoreAuth
注解,代码如下。
/**
* 列表
*/
@IgnoreAuth
@RequestMapping("/lists")
public R list( BanjileixingEntity banjileixing){
EntityWrapper<BanjileixingEntity> ew = new EntityWrapper<BanjileixingEntity>();
ew.allEq(MPUtil.allEQMapPre( banjileixing, "banjileixing"));
return R.ok().put("data", banjileixingService.selectListView(ew));
}
Java静态资源文件鉴权过滤是一种在Web应用程序中保护静态资源(如图片、CSS、JavaScript等)的技术,通过实现特定的过滤器(Filter)来对访问这些资源的请求进行权限验证。这种技术可以确保只有经过授权的用户才能访问特定的资源,从而提高应用程序的安全性。在实现过程中,开发者需要定义一个继承自Filter接口的类,并重写doFilter方法,以实现对请求的拦截和处理。在doFilter方法中,可以检查用户的认证信息,如session、token等,以确定用户是否有权访问请求的资源。如果用户未授权,可以返回错误响应或重定向到登录页面。通过这种方式,Java静态资源文件鉴权过滤能够有效地保护Web应用程序中的静态资源,防止未授权访问。
T 系列项目中对应代码如下。
/**
* springboot 2.0配置WebMvcConfigurationSupport之后,会导致默认配置被覆盖,要访问静态资源需要重写addResourceHandlers方法
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/resources/")
.addResourceLocations("classpath:/static/")
.addResourceLocations("classpath:/admin/")
.addResourceLocations("classpath:/front/")
.addResourceLocations("classpath:/public/");
super.addResourceHandlers(registry);
}