如何在没有 XML 配置的情况下定义自定义身份验证入口点

2022-09-01 09:32:17

我已经挣扎了几天了。我对Spring Boot有点陌生,喜欢不使用XML配置的想法。

我创建了一个RESTfull应用程序(使用JSON)。我正在按照本教程正确配置身份验证。

我想我设法使用Java配置复制了几乎所有的配置,除了一件事 -AuthenticationEntryPoint

本教程使用类似如下的属性 in 标记,并按以下方式定义 formLoginhttp

<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手册中的AuthorationEntryPoint解释说:

可以使用 http > 元素上的 entry-point-ref 属性设置 AuthenticationentryPoint <。

没有提到任何关于如何使用Java配置来做到这一点的信息。

那么,如何在没有XML的情况下“注册”我自己的,以防止在使用formLogin时重定向到登录表单?restAuthenticationEntryPoint

下面我将提到我尝试过的东西。

谢谢大家。


在我的尝试中,发现您可以使用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.formLogin()

创建的共享对象

填充以下共享对象

AuthenticationEntryPoint

但找不到覆盖它的方法。
有什么想法吗?

PS
:不要认为将登录表单覆盖为仅返回错误的自定义表单是一个好主意。


答案 1

您提供的 ref 文档中的引用指向了 。您可以在此处设置共享入口点。http.exceptionHandling()

http.exceptionHandling().authenticationEntryPoint(myEntryPoint);

答案 2

推荐