如何在没有XML配置的情况下定义自定义AuthenticationEntryPoint

时间:2014-07-10 19:32:02

标签: java spring spring-security spring-boot

我现在已经挣扎了好几天了。我是Spring Boot的新手,并且喜欢不使用XML配置的想法。

我创建了一个RESTfull应用程序(使用JSON)。我正在this tutorial之后正确配置身份验证。

我认为我设法使用Java配置重现了几乎所有配置,除了一件事 - AuthenticationEntryPoint

本教程使用http标记中的属性,并按以下方式定义 formLogin

<http entry-point-ref="restAuthenticationEntryPoint">

  <intercept-url pattern="/api/admin/**" access="ROLE_ADMIN"/>

  <form-login
     authentication-success-handler-ref="mySuccessHandler"
     authentication-failure-handler-ref="myFailureHandler"
  />

  <logout />

</http>

Spring Security manual中的 AuthenticationEntryPoint 说明:

  

可以使用&lt;上的entry-point-ref属性设置AuthenticationEntryPoint。 http&gt;元件。

没有提及任何有关如何使用Java配置执行此操作的内容。

那么我怎样才能注册&#34;我自己的restAuthenticationEntryPoint没有XML,以防止在使用 formLogin 时重定向到登录表单?

下面我会提到我的尝试。

谢谢大家。


在我的尝试中,发现您可以使用 basicAuth 来定义它:

@Configuration
@Order(1)                                                        
public static class RestWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {


        if (restAuthenticationEntryPoint == null) {
            restAuthenticationEntryPoint = new RestAuthenticationEntryPoint();
        }

        http
            .authorizeRequests()
                .antMatchers("/**").hasAnyRole(Sec.ADMIN,Sec.SUPER_USER)
...
        .and()
            .httpBasic()
                .authenticationEntryPoint(restAuthenticationEntryPoint)

但是我正在使用这样的表单登录(没有 httpBasic 部分):

        .and()
            .formLogin()
                .successHandler(mySavedRequestAwareAuthenticationSuccessHandler)
                .failureHandler(simpleUrlAuthenticationFailureHandler)

问题是,当它没有收到凭据时会重定向到登录表单。由于这是一项REST服务,因此不应该这样做。

FormLoginConfigurer的{​​{3}}(.formLogin()类使用)说:

  

创建的共享对象

     

填充以下共享对象

AuthenticationEntryPoint

但无法找到替代它的方法 有什么想法吗?

P.S。
不要认为将登录表单覆盖到仅返回错误的自定义表单是个好主意。

1 个答案:

答案 0 :(得分:50)

您提供的参考文档中的引用指向http.exceptionHandling()。您可以在那里设置共享入口点。

http.exceptionHandling().authenticationEntryPoint(myEntryPoint);