SpringSecurity问题汇总
1.OPTIONS返回401错误
在配置了SpringSecurity之后,所有的OPTIONS请求都变成了401。即便我自定义了AccessDeniedHandler,AuthenticationEntryPoint也不走相应的代码。
![错误](/images/loadimg.png)
1 |
|
在参考文章中,有两种放行策略:
(1) 一种是configure(WebSecurity web) 方法中配置放行。这种是不走过滤器链的。
(2) 一种是在 configure(HttpSecurity http) 方法中进行配置。这种是走过滤器链的。
2.跨域配置
1 |
|
3.permitAll不起作用
当我在配置的时候,准备忽略掉某些请求的时候,使用了permitAll,本以为使用之后,就不再走过滤器链了,可是,当我定义了”/login”, “/index”,”/loginWX”,”/get_auth_access_token”,”/getUserInfoToken”,”/wechatBridge”,”/wxapi/getJsSDK”,这些路由,最后还是会出现在tokenAuthenticationFilter过滤器链中,认证不成功,也还是会返回授权失败的信息。
1 |
|
第一种解决方法,使用WebSecurity进行路由忽略
1 |
|
这里要注意,如果你这样写了,那么就不能使用@Component注解自定义的过滤器,否则,上面的配置还是不起作用,最后所有的请求还是会走自定义的过滤器链。
1.Why is permitAll() not working and it asks for authentication object in request?
2.Spring security application of antMatcher() vs. antMatchers()
3.java - antMatcher()和antMatchers()的Spring安全性应用
4.关于springboot security自定义拦截器 使用 permitAll() 之后仍然会走过滤器的解决方法 (这篇文章就是听过使用web配置过滤掉不需要执行过滤器链的方法)
5.Spring webSecurity.ignoring() doesn’t ignore custom filter (这里讲了一个要去掉@Component的问题)
6.spring Boot 配置了指定过滤路径却没生效 (这里说了为什么会失效的问题)
7.web.ignoring()和permitAll的区别 (这两个还是有区别的)
8.spring security运行时配置ignore url
9.一文解决Security中访问静态资源和web.ignoring()和perimitAll()不起作用 (这个一文,最后也没有解决我的问题,我又想忽略某些路由,又想在filter中使用自动注入)
9.SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(二)
10.关于spring boot security设置忽略地址不生效问题
解决web.ignoring()失效及TokenAuthenticationFilter中注入@Autowired注入失败的问题
那如果我既想忽略相关的路由,又想让filter中的自动注入生效怎么办呢?web应用启动的顺序顺是:listener->filter->servlet
可以使用构造函数注入法:在filter中新建一个带参数的构造函数,然后将RedisUtils作为参数传入。这里写不写@Autowired,好像都没有关系。
1 | public class TokenAuthenticationFilter extends OncePerRequestFilter{ |
通过构造函数的方式将需要的Bean注入到TokenAuthenticationFilter。
1 |
|
1.Spring Security 自定义 AuthenticationProvider无法@Autowired问题 (在AuthenticationProvider中使用@Autowired始终为null,使用了return一个新的类的方式)
2.Springboot注入带参数的构造函数 ()
3.@Autowired的使用:推荐对构造函数进行注释 ()
4.Use @Autowired with a Filter configured in SpringBoot (这篇文章中也是用构造函数的方式,注入了SpringBoot的Bean)
5.filter过滤器使用Autowired注入Bean为null (使用ServletContext获取相应的Bean,这个我倒是没有尝试过)
6.SpringBoot Filter中注入Bean (使用构造函数的方式注入Bean)
7.Spring Boot配置接口 WebMvcConfigurer (如何配置WebMvcConfigurer)
8.如何在Java的Filter中注入Service??? (也讲了和三种方法在filter中注入Service)
9.8.6 Spring Boot集成Spring Security (从刚开始的默认自动生成用户名密码到最后的自定义userDetailsService,从数据库中取出数据进行验证,文章非常的长)
4.session管理
1 |
|
5.URL contained a potentially malicious String “//“
双斜杠被返回错误,将spring security部署到服务器上,前端调用总是出现问题:org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL contained a potentially malicious String “//“
![错误](/images/loadimg.png)
但是我的请求里面没有双斜杠啊,查看nginx的日志,发现还是一个斜杠啊
![错误](/images/loadimg.png)
使用nginx进行配置
最后修改了nginx的配置,解决了相关的问题。还有就是通过增加过滤器的方式进行的强制通过,就像下面的两篇文章。
1 | ## 设置跨域白名单 |
使用代码解决
org.springframework.boot:spring-boot-starter-security:2.3.1.RELEASE,这是我的secuirty版本。
有效的一种方法就是直接定义个默认的Bean,定义了这个defaultHttpFirewall之后,不需要Configure中注入也可以使用。
1 |
|
还有就是定义双斜杠忽略
1 |
|
1.Spring security on the URL contains double slashes are blocked by permission processing 这里是通过设置了一个filter,在执行Security之前,先把url的双斜杠,改为单斜杠解决问题。
2.Spring Security 之 StrictHttpFirewall 坑 这篇文章我有点看不懂,虽然他也是设置无效,但是又说defaultHttpFirewall有效,我很是不能理解。
3.The request was rejected because the URL contained a potentially malicious String “;”报错解决 这个直接在Application中写了allowUrlSemicolonHttpFirewall这个Bean,但是实际上无效。
4.Spring Security 自带防火墙!你都不知道自己的系统有多安全! 我在这里才找到了为什么我配置双斜杠无效不起作用的问题。
5.spring-security使用-安全防护HttpFirewall(七) 提供了类图DefaultfHttpFirewall和StrictHttpFirewall都是继承自HttpFirewall,有这几种限制:限制请求方法、请求地址不能有分号、必须是可打印的 ASCII 字符、不能使用双斜杠、% 不被允许、反斜杠不被允许、. 不被允许
6.Spring Security Web : StrictHttpFirewall HTTP防火墙(严格模式) 包括了各种分析和源码展示
无效的解决方案
使用代码时,第一步创建一个HttpFirewall
1 |
|
第二步,注入这个创建的Bean
1 |
|
经过上面的方法,我本以为可以了,但是实际上,还是会报错,我不知道自己那里做错了。
这个方法虽然说无效,其实是因为针对我的双斜杠无效,其实应该是setAllowUrlEncodedDoubleSlash(true)
1.Spring 5.0.3 RequestRejectedException: The request was rejected because the URL was not normalized (这里主要提到的是Security问题,只需要增加一个HttpFirewall的配置,允许双斜杠就可以了。)
2.security.web.firewall.RequestRejectedException: The request was rejected because the URL contained a potentially malicious String “;” 这篇文章从发现问题,到一步步到debug,表明了如何去除“;“这个问题,虽然不是双斜杠问题,但是也差不多
3.Customized HttpFirewall to allow // is not applied at StrictHttpFirewall (创建了一个looseHttpFirewall的Bean,和我的方法差不多)
4.SpringSecurity手动忽略双斜杠校验//以及修改Jar包内源码 这里直接修改了源码,然后又倒入回去了,我觉得这样不妥。