序
之前有篇文章讲了怎么进行免登录动态配置的方案,动用了反射去实现,有点黑魔法的味道,这里再介绍另外一种方案
permitAll
spring-security-config-4.2.3.RELEASE-sources.jar!/org/springframework/security/config/annotation/web/configurers/ExpressionUrlAuthorizationConfigurer.java
1 | 复制代码public final class ExpressionUrlAuthorizationConfigurer<H extends HttpSecurityBuilder<H>> |
permitAll操作将“permitAll”这个attribute以及对应的requestMatchers添加到REGISTRY
思路
1 | 复制代码@EnableWebSecurity |
这里重点注意这个anyRequest().authenticated(),可以看到没有配置permitAll的请求,都要求authenticated这个级别的,而AnonymousAuthenticationFilter设置的匿名级别只是anonymous。
于是我们的思路就来了,新建一个filter,插入在AnonymousAuthenticationFilter之前,对于免登录的设置为authenticated
DemoFilter
1 | 复制代码public class DemoFilter extends GenericFilterBean { |
这里创建了一个伪造的UsernamePasswordAuthenticationToken
这里有一点要注意一下,就在判断不是配置的允许匿名访问的url的时候,如果之前的token是我们设置的,则需要重新清空,防止一旦访问匿名url之后获取session再去越权访问其他没有配置的url。
配置filter
1 | 复制代码@EnableWebSecurity |
在AnonymousAuthenticationFilter之前提前设置好SecurityContextHolder里头的authentication。
小结
这样基本就大功告成了,不过有几点需要注意:
- 自定义的filter,可能存在执行两遍的问题,这点后面的文章来讲
- 获取到的uri无法处理pathvariable的情况,需要根据url pattern来处理,这点后面再讲述一下
doc
本文转载自: 掘金