添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

项目场景:

在使用SpringSecurity的过程中,我们一般会定义一个自定义过滤器来进行一些权限校验或者其他的操作,当然有某些特定的URL我们并不希望它们被过滤器拦截,那么我们会在SpringSecurity的Config中配置白名单来让我们的部分接口不需要token也可以访问

在今天debug接口的时候,我发现了虽然我的白名单接口是可以正常获取到结果的,但是在我观察console的时候居然出了这么一行的日志
在这里插入图片描述
这个日志出现的原因当然是因为我本次请求没有携带token,这是当然的,白名单接口是不需要token的,但是问题来了,为什么这个请求会经过我自定义的过滤器呢,我不是在SpringSecurity的配置中配置了白名单么,为什么走了filter,但是又正确的返回了结果,没有被权限校验拦截呢。

解决方案:

1.SpringSecurity配置

出现这种情况是因为我们重写的是SpringSecurity的这个protected void configure(HttpSecurity httpSecurity) 方法

protected void configure(HttpSecurity httpSecurity) 中配置的白名单仅仅是让Security框架忽略对指定路径的权限校验,并不代表配置了白名单之后指定路径就不走过滤链了

public void configure(WebSecurity web) 我们需要在这个方法中定义忽略指定路径,例如

	@Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/test/**");

这样配置之后指定的路径会绕过Security管理的所有Filter

2.SpringBean配置

在像上述配置之后,可能出现还是走自定义拦截器的情况,这个是因为我们将Filter作为Bean注册到Spring中了

更改前我们是这么配置的
在这里插入图片描述

在这里插入图片描述
更改后我们是这么配置的
在这里插入图片描述

在这里插入图片描述
可以看到我们做的操作仅仅是将TokenFilter不作为Bean注入,在Security配置中使用new的方式让Security来管理他,这是因为我们将Filter作为Bean注入后,Spring会自动将其管理,即使你在Security中配置了忽略,Spring还是照样会将请求使用过滤器进行过滤

在实际使用过程中,我们还是不要将接口使用web进行ignoring管理,因为我们的过滤器链中不仅有我们自定义的过滤器还会有一些Security原生的过滤器,为了避免引发更多问题我门仅仅用httpSecurity进行管理就好了,顺便说一下是参考了stackoverflow上的回答

2023-03更新

很多人不明白这篇文章是怎么解决双重过滤的问题的,简单的说一下就是不要在你的filter上使用@Component之类的注解,这样你会将filter注册到spring bean容器中,spring会将请求自动走一遍,同时security也会走一遍。所以改动只要去掉@Component注解,在securityConfig中使用new的方式将filter注册到security filter链中,交由security去管理。如果还是不明白可以去看一下上面的stackoverflow中的原回答或者评论留言,还会的话都会解答,security我也很久不用了

依然是我负责的认证模块,出现了业务上的问题,想要使某些接口不过滤链,但是再security上配置 .antMatchers("/**").permitAll() 之后,前端访问进来,依然我的 token 过滤器 public class JWTAuthorizationFilter extends BasicAuthenticationFilter { 解决方法一 http.authorizeRequests() .antMatchers("/*").hasRole("user") .antMatchers("/").permitAll() 这个时候发现任何请求根目录403了,这是为什么呢? 其实我们在这么做的时候必须把第一行...
Spring Security是Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户 授权:经过授权认证后判断当前用户是否有权限进行某个操作。 1.快速入门 2.1获取用户信息 2.2 思路分析 2.2.1重写UserDetailServiceImpl 2.2.2替换掉加密方式 2.3登录接口 2.4认证通过过滤器
在javaweb开发中,过滤器Filter比较常用于类似登录的拦截等场景。但是,当过滤器配置不当时就把所有的请求都拦截,静态资源也被拦截掉,导致静态页面加载不出来。 一般的解决方案是在过滤器代码中对所有的静态资源放行,但这样硬编码的方式特别不灵活,代码复用性也不高。下面说个更优雅点的方案。 一、解决方案 如果将静态资源放行的功能做成在web.xml中可以直接配置的话,就比较方便了。因此我...
方法一、过滤器使用@Component注解时,@value注解可用 说明:如果使用@Component,同时将Filter通过@Configuration加入过滤链时,@value将拿不到值。 @Component public class CorsFilter implements Filter { @Value("${xx.security.csrf-ingores}") private String csrfIngores; /************解决Origin跨域
第二个是角色,不同的网址、资源可能需要是某些角色才能访问 第三个就是授权,对于别人提供的登录凭证(账号密码),你要鉴定并在鉴定通过后给别人授权。 第四个就是配置哪些地方需要什么权限。 被权限管理的可以是网址、函数等,常用的就是网址的访问、函数的调用 默认登录地址/login ,默认的退出登录地址/logout,有默认的页面在 maven依赖: <dependency>
【原文链接】:https://blog.51cto.com/u_15080000/2592242 一、两种思路 在 Spring Security 中,有一个资源,如果你希望用户不用登录就能访问,那么一般来说,你有两种配置策略: 第一种就是在 configure(WebSecurity web) 方法中配置放行,像下面这样: @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMa