springsecurity的URL过滤和全局过滤

本文介绍如何使用Spring Security进行URL过滤配置,通过AntUrlPathMatcher实现对项目资源的保护,仅允许已登录用户访问特定路径。同时,探讨了不同路径匹配规则的应用场景,并分享了调试技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springsecurity的URL过滤和全局过滤

最近有个需求,需要配置一个登陆用户才能访问项目的资源,也就是说要配置一个/*形式的链接,保护项目中所有的资源,要登录了的用户才能访问,
当然是要除开登陆页面之外。

springsecurity对URL过滤是采用的正则表达式,其实一直就在使用springsecurity,只是最近才引起重视。
参考文章:
http://www.family168.com/oa/springsecurity/html/ch215-url-matcher.html

我采用了AntUrlPathMatcher简单路径匹配,也不去弄RegexUrlPathMatcher这个正则这个东东,有个简单路径匹配应该也够了。三个原则:
通配符:?   匹配任意一个字符
通配符:*   匹配任意多个字符,但不能跨越目录
通配符:** 可以匹配任意多个字符,可以跨越目录

我这里只需要这样使用就行了。
匹配上我不拦截的:
<intercept-url pattern="/common/**" filters="none"/>
<intercept-url pattern="/images/**" filters="none"/>
<intercept-url pattern="/css/**" filters="none"/>
<intercept-url pattern="/js/**" filters="none"/>
<intercept-url pattern="/index.jsp" filters="none"/>
<intercept-url pattern="/login.action*" filters="none"/>
<intercept-url pattern="/" filters="none"/>

数据库里面增加一条我要拦截的:
String localAntPath8 = "/**";
List<ConfigAttribute> configList8 = new LinkedList<ConfigAttribute>();
configList8.add(new SecurityConfig("ROLE_ALL_LOGON"));
ConfigAttributeDefinition cad8 = new ConfigAttributeDefinition(configList8);
RequestKey requestKey8 = new RequestKey(localAntPath8);

OK了,可以保护/**下所有的资源,不登陆就没有的玩了,当然,还要保证的就是所有登陆用户都有ROLE_ALL_LOGON这个权限。

另外这次配置还了解到不少东东。
1./j_spring_security_logout和/j_spring_security_check是不在这拦截之列的。
2.mini-web项目的日志的级别,请在文件logback.xml中修改,我也是增加了如下一行,才能看到springsecurity的详细日志:
<logger name="org.springframework.security">
<level value="DEBUG" />
</logger>
3.配置匿名访问用户可以这样配置(虽然这次没有用上)
<intercept-url pattern="/common/**" access="ROLE_ANONYMOUS" />
<intercept-url pattern="/images/**" access="ROLE_ANONYMOUS" />
<intercept-url pattern="/css/**" access="ROLE_ANONYMOUS" />
<intercept-url pattern="/js/**" access="ROLE_ANONYMOUS" />
4.在这里类里面org.springside.examples.miniweb.service.security.RequestMapFactoryBean的LinkedHashMap是要顺序输出的
所以,在权限里面添加的顺序是按照先入先拦截的几率去拦截的。
我的测试类:
public static void main(String[] args) {
Map<String, String> map1 = new LinkedHashMap<String, String>();
Map<String, String> map2 = new HashMap<String, String>();
for (int i = 0; i < 10; i++) {
   map1.put(i + "", i + "");
}
for (int i = 0; i < 10; i++) {
   map2.put(i + "", i + "");
}
 
System.out.println(map1.toString());
System.out.println(map2.toString());
}
打印出来是:
{0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9}
{3=3, 5=5, 7=7, 2=2, 0=0, 9=9, 4=4, 8=8, 6=6, 1=1}

### 配置Spring Security 6中的特殊路由自定义过滤器Spring Security 6中,为了给特定路径配置自定义过滤器而不影响其他请求处理逻辑,可以采用多种方式来实现这一目标。一种常见的方式是在`HttpSecurity`对象内通过`.addFilterAt()`方法指定过滤器及其应用的具体URL模式。 当向应用程序的安全机制引入新的过滤器时,重要的是要确保这些过滤器仅应用于预期的HTTP请求上[^1]。对于希望针对某些特定端点实施额外安全措施的情况而言,在构建安全链的过程中精确指派过滤器就显得尤为重要了。 下面是一个简单的例子展示如何创建并注册一个只作用于特定路径(例如`/api/special/**`)上的自定义过滤器: #### 创建自定义过滤器类 ```java import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; public class SpecialRouteFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 自定义逻辑... System.out.println("Special route filter is working!"); filterChain.doFilter(request, response); } } ``` #### 修改Spring Security配置类 ```java @Configuration @EnableWebSecurity public class WebSecurityConfig { private final SpecialRouteFilter specialRouteFilter; public WebSecurityConfig(SpecialRouteFilter specialRouteFilter){ this.specialRouteFilter = specialRouteFilter; } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeHttpRequests((requests) -> requests .requestMatchers("/api/special/**").permitAll()// 或者根据需求调整权限策略 .anyRequest().authenticated()) .formLogin(withDefaults()); // 将自定义过滤器绑定到/api/special/**路径下 http.addFilterBefore(specialRouteFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); } } ``` 上述代码片段展示了如何在一个基于Spring Boot的应用程序里为特殊的API接口添加专门设计的安全过滤器。这里的关键在于使用了`http.addFilterBefore(...)`函数,并且明确了该过滤器应该位于认证过程之前执行。这样做不仅能够满足对特定资源施加独特保护的需求,同时也避免了不必要的全局范围内的性能开销[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值