我需要开发一个休息服务 wirh Spring Security(版本 4.0.3。RELEASE)的安全性。
场景是:
自定义 header 上的 token )
我创建了一个自定义
OncePerRequestFilter
它完成了读取自定义 token 的工作,就像它是 basic auth
token 。public class MyClientAuthorizationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
// omitting implementation
}
}
然后我创建了自己的
AuthenticationEntryPoint
这完成了在响应中写入 JSON 错误的工作。public class MyAuthorizationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
// omitting implementation
}
}
然后我像这样把它们连接起来:
@Configuration
@EnableWebSecurity
public class WebApiSecurityConfig extends WebSecurityConfigurerAdapter implements TogatherWebApiCostants {
private static final Logger log = LoggerFactory.getLogger(WebApiSecurityConfig.class);
private @Inject Environment environment;
@Bean
protected AuthenticationEntryPoint clientAuthorizationEntryPoint() {
return new MyAuthorizationEntryPoint();
}
@Bean
protected Filter clientAuthorizationFilter() {
return new MyAuthorizationFilter();
}
/**
* @see org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter#configure(org.springframework.security.config.annotation.web.builders.HttpSecurity)
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
log.debug("Configuring HTTP security");
// @formatter:on
http
.addFilterBefore(clientAuthorizationFilter(), BasicAuthenticationFilter.class)
.exceptionHandling().authenticationEntryPoint(clientAuthorizationEntryPoint());
// @formatter:off
}
}
一切正常,除了自定义入口点。它没有被解雇,而且似乎 Spring 仍在使用默认的。我还尝试切换到 XML 配置(我更习惯于使用它而不是 JavaConfig 方法)但行为保持不变。
谁能告诉我我做错了什么?
注意:我尝试通过添加记录器来调试 Spring Security
org.springframework.security
级别设置为 debug
,但我没有看到任何日志消息~~~~~~~~~~~~~~~
编辑:添加当前的解决方法
到目前为止,缺乏优雅的解决方案,我只是从过滤器中明确调用入口点。
public class MyClientAuthorizationFilter extends OncePerRequestFilter {
...
private @Inject AuthenticationEntryPoint entryPoint;
...
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
// omitting logic
} catch(AuthenticationException ae) {
SecurityContextHolder.clearContext();
entryPoint.commence(request, response, ae);
return;
}
}
}
最佳答案
看起来您在 authenticationEntryPoint()
中传递了错误的对象的 WebApiSecurityConfig
实现类,通过AuthenticationEntryPoint
在这里的实现类对象 TogatherWebApiClientAuthorizationEntryPoint
并检查您是否收到自定义错误。
关于java - Spring security - 休息服务的自定义过滤器和入口点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52125934/