如何调整authenticationEntryPoint行为Spring Security

时间:2019-05-24 10:47:29

标签: spring spring-security spring-security-oauth2

我在GUI应用程序和后端之前有一个基于Spring Boot 2的安全网关,用于执行OAuth2身份验证。 它的配置就像

@Configuration
@EnableOAuth2Client
@EnableWebSecurity
public class SecurityGatewayConfig extends WebSecurityConfigurerAdapter{

    @Bean
    public SecurityGatewayAuthenticationFilter filter() {
        return new SecurityGatewayAuthenticationFilter("/login");
    }

    @Override
    public void configure(HttpSecurity http) {
        http
                .addFilterAfter(new OAuth2ClientContextFilter(), AbstractPreAuthenticatedProcessingFilter.class)
                .addFilterAfter(filter(), OAuth2ClientContextFilter.class)
                .httpBasic().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login"))
                .and()
...

它将请求重定向到/loginSecurityGatewayAuthenticationFilter针对外部OAuth2提供程序执行身份验证。

这对GIU应用程序非常有用。但是,在访问后端服务(路径中有 / api / )时,我需要采取其他行为:如果请求未通过身份验证,则不要重定向,而应立即返回 401 错误。

任何想法,如何为此配置Spring Security?

2 个答案:

答案 0 :(得分:0)

如果我向您提出正确的问题,您可以做的是使用不同的ConfigurationAdapters。基本思路如下:

    @Bean
    public RequestMatcher defaultMatcher(@Qualifier("apiMatcher") RequestMatcher api, @Qualifier("anyother") RequestMatcher anyother) {
        final RequestMatcher all = new AntPathRequestMatcher("/**");
        final RequestMatcher nonApi = new NegatedRequestMatcher(new OrRequestMatcher(api, anyother));

        return new AndRequestMatcher(all, nonApi);
    }

如果您使用@ EnableResourceServer,Spring将按照您在Order()中添加的顺序评估每个请求,它将始终具有Order(3)

然后,您可以像这样的示例构建请求匹配器(在此示例中,它匹配所有请求,但明确排除其他一些请求):

lis = []
for i in range(len(spoken_train)):
    item = spoken_train[i]
    lis.append( item + np.zeros((1,item.shape[-1])))
myarray = np.concatenate(lis) 

希望有帮助。

最好的问候, WiPu

答案 1 :(得分:0)

您需要添加入口点过滤器

`@Component 公共最终类CustomAuthenticationEntryPoint实现         AuthenticationEntryPoint {     @Override     公共无效开始(最终HttpServletRequest请求,最终             HttpServletResponse响应,最终AuthenticationException         authException)引发IOException {         response.sendError(HttpServletResponse.SC_UNAUTHORIZED,“未授权”);     } } 当客户端未经身份验证访问资源时...

`