我可以使用 Spring Security 的 AbstractAuthenticationProcessingFilter 来处理身份验证作为 /oauth/authorize 请求处理的一部分吗?

Posted

技术标签:

【中文标题】我可以使用 Spring Security 的 AbstractAuthenticationProcessingFilter 来处理身份验证作为 /oauth/authorize 请求处理的一部分吗?【英文标题】:Can I use Spring Security's AbstractAuthenticationProcessingFilter to handle authentication as part of /oauth/authorize request handling? 【发布时间】:2017-11-17 04:49:03 【问题描述】:

在我们的应用程序中,我想使用 Spring Security 来实现身份验证过滤,作为对 /oauth/authorize 的请求的一部分。我添加了过滤器和提供程序 - 扩展 org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter - 以提供自定义身份验证。 但是我不知道在实现AuthenticationSuccessHandler#onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) 时该怎么做,以便过滤请求不会导致对浏览器的重定向响应 - 而是程序继续到旨在处理请求的org.springframework.security.oauth2.provider.endpoint.AuthorizationEndpoint#authorize(...)

【问题讨论】:

【参考方案1】:

是的,这似乎是在到达 Spring 自己的 /oauth/authorize 请求处理程序之前在过滤器链中进行身份验证的有效方法。

在我们的案例中,早期工作设置了“AuthorizationServerEndpointsConfigurer”端点映射,这干扰了我的身份验证成功处理程序向前转发请求的尝试。

所以,我的实现包括一个扩展 AbstractAuthenticationProcessingFilter 的自定义身份验证过滤器,通过 WebSecurityConfigurerAdapter 集成到 Spring 安全过滤器链中,

@Override
protected void configure(HttpSecurity http) throws Exception 
http
// ... 
    .addFilterBefore(
        passwordLessAuthenticationFilter(authenticationManager()),
        UsernamePasswordAuthenticationFilter.class)
// ...

自定义 PasswordLessAuthenticationFilter 是使用 ant 路径匹配器值构造的,例如“/foo/oauth/授权”。 自定义过滤器被定义为存储对实例 Spring 的 ForwardAuthenticationSuccessHandler 的引用,其转发 url 值为“oauth/authorize”。

【讨论】:

以上是关于我可以使用 Spring Security 的 AbstractAuthenticationProcessingFilter 来处理身份验证作为 /oauth/authorize 请求处理的一部分吗?的主要内容,如果未能解决你的问题,请参考以下文章

单点登录系统使用Spring Security的权限功能

Spring security 获取当前用户

Spring-Security

Spring Security - 多个会话取决于使用情况(登录/httpBasic)

我可以将 Spring Social 与 Spring Security 一起使用吗?

有啥方法可以强制在 spring-security 中的某些页面使用 https 吗?