概述
介绍
作为一个配置HttpSecurity
的SecurityConfigurer
,ServletApiConfigurer
的配置任务如下 :
- 配置如下安全过滤器
Filter
SecurityContextHolderAwareRequestFilter
- 过滤器的属性
authenticationManager
来自共享对象AuthenticationManager
- 过滤器的属性
authenticationEntryPoint
来自配置器ExceptionHandlingConfigurer
的设置值,否则缺省为null
- 过滤器的属性
logoutHandlers
来自配置器LogoutConfigurer
的设置值,否则缺省为null
- 过滤器的属性
trustResolver
来自共享对象AuthenticationTrustResolver
,否则额缺省为AuthenticationTrustResolverImpl
- 过滤器的属性
rolePrefix
来自类型为GrantedAuthorityDefaults
的bean
,否则缺省为ROLE_
- 过滤器的属性
继承关系
使用
// HttpSecurity 源代码片段
public ServletApiConfigurer<HttpSecurity> servletApi() throws Exception {
return getOrApply(new ServletApiConfigurer<>());
}
源代码
源代码版本 Spring Security Config 5.1.4.RELEASE
package org.springframework.security.config.annotation.web.configurers;
// 省略 imports
public final class ServletApiConfigurer<H extends HttpSecurityBuilder<H>> extends
AbstractHttpConfigurer<ServletApiConfigurer<H>, H> {
private SecurityContextHolderAwareRequestFilter securityContextRequestFilter =
new SecurityContextHolderAwareRequestFilter();
/**
* Creates a new instance
* @see HttpSecurity#servletApi()
*/
public ServletApiConfigurer() {
}
public ServletApiConfigurer<H> rolePrefix(String rolePrefix) {
securityContextRequestFilter.setRolePrefix(rolePrefix);
return this;
}
@Override
@SuppressWarnings("unchecked")
public void configure(H http) throws Exception {
securityContextRequestFilter.setAuthenticationManager(http
.getSharedObject(AuthenticationManager.class));
ExceptionHandlingConfigurer<H> exceptionConf = http
.getConfigurer(ExceptionHandlingConfigurer.class);
AuthenticationEntryPoint authenticationEntryPoint = exceptionConf == null ? null
: exceptionConf.getAuthenticationEntryPoint(http);
securityContextRequestFilter
.setAuthenticationEntryPoint(authenticationEntryPoint);
LogoutConfigurer<H> logoutConf = http.getConfigurer(LogoutConfigurer.class);
List<LogoutHandler> logoutHandlers = logoutConf == null ? null : logoutConf
.getLogoutHandlers();
securityContextRequestFilter.setLogoutHandlers(logoutHandlers);
AuthenticationTrustResolver trustResolver = http
.getSharedObject(AuthenticationTrustResolver.class);
if (trustResolver != null) {
securityContextRequestFilter.setTrustResolver(trustResolver);
}
ApplicationContext context = http.getSharedObject(ApplicationContext.class);
if (context != null) {
String[] grantedAuthorityDefaultsBeanNames =
context.getBeanNamesForType(GrantedAuthorityDefaults.class);
if (grantedAuthorityDefaultsBeanNames.length == 1) {
GrantedAuthorityDefaults grantedAuthorityDefaults =
context.getBean(grantedAuthorityDefaultsBeanNames[0],
GrantedAuthorityDefaults.class);
securityContextRequestFilter.setRolePrefix(grantedAuthorityDefaults.getRolePrefix());
}
}
securityContextRequestFilter = postProcess(securityContextRequestFilter);
http.addFilter(securityContextRequestFilter);
}
}