序
本文主要聊一下spring security的permitAll以及webIgnore的区别
permitAll配置实例
1 | 复制代码@EnableWebSecurity |
web ignore配置实例
1 | 复制代码@EnableWebSecurity |
二者区别
顾名思义,WebSecurity主要是配置跟web资源相关的,比如css、js、images等等,但是这个还不是本质的区别,关键的区别如下:
- ingore是完全绕过了spring security的所有filter,相当于不走spring security
- permitall没有绕过spring security,其中包含了登录的以及匿名的。
AnonymousAuthenticationFilter
spring-security-web-4.2.3.RELEASE-sources.jar!/org/springframework/security/web/authentication/AnonymousAuthenticationFilter.java
1 | 复制代码/** |
这个filter的主要功能就是给没有登陆的用户,填充AnonymousAuthenticationToken到SecurityContextHolder的Authentication,后续依赖Authentication的代码可以统一处理。
FilterComparator
spring-security-config-4.1.4.RELEASE-sources.jar!/org/springframework/security/config/annotation/web/builders/FilterComparator.java
1 | 复制代码final class FilterComparator implements Comparator<Filter>, Serializable { |
这个类定义了spring security内置的filter的优先级,AnonymousAuthenticationFilter在倒数第五个执行,在FilterSecurityInterceptor这个类之前。
FilterSecurityInterceptor
spring-security-web-4.2.3.RELEASE-sources.jar!/org/springframework/security/web/access/intercept/FilterSecurityInterceptor.java
1 | 复制代码/** |
这个相当于spring security的核心处理类了,它继承抽象类AbstractSecurityInterceptor
spring-security-core-4.2.3.RELEASE-sources.jar!/org/springframework/security/access/intercept/AbstractSecurityInterceptor.java
1 | 复制代码public abstract class AbstractSecurityInterceptor implements InitializingBean, |
主要的逻辑在这个beforeInvocation方法,它就依赖了authentication
1 | 复制代码private Authentication authenticateIfRequired() { |
这个方法判断authentication如果是已经校验过的,则返回;没有校验过的话,则调用authenticationManager进行鉴权。
而AnonymousAuthenticationFilter设置的authentication在这个时候就派上用场了
spring-security-core-4.2.3.RELEASE-sources.jar!/org/springframework/security/authentication/AnonymousAuthenticationToken.java
1
2
3
4
5 > public class AnonymousAuthenticationToken extends AbstractAuthenticationToken implements
> Serializable {
> private AnonymousAuthenticationToken(Integer keyHash, Object principal,
> Collection<? extends GrantedAuthority> authorities) {
> super(authorities);
复制代码 if (principal == null || “”.equals(principal)) {
throw new IllegalArgumentException(“principal cannot be null or empty”);
}
Assert.notEmpty(authorities, “authorities cannot be null or empty”);
this.keyHash = keyHash;
this.principal = principal;
setAuthenticated(true);
}
//……
1 | } |
它默认就是authenticated
小结
- web ignore比较适合配置前端相关的静态资源,它是完全绕过spring security的所有filter的;
- 而permitAll,会给没有登录的用户适配一个AnonymousAuthenticationToken,设置到SecurityContextHolder,方便后面的filter可以统一处理authentication。
doc
- spring security 的几个细节
- Spring Security – security none, filters none, access permitAll
- Spring Security permitAll() not allowing anonymous access
- Difference between access=“permitAll” and filters=“none”?
本文转载自: 掘金