Дайджест-аутентификация с пружинной безопасностью: 401 получено, как и ожидалось, но с двумя заголовками WWW-Authenticate - PullRequest
2 голосов
/ 12 марта 2019

Когда я отправляю запрос PUT с правильным именем пользователя и паролем, он работает нормально. Но когда я отправляю запрос с неверным паролем, я получаю 401, что нормально, но у меня есть 2 заголовка WWW-Authenticate:

Заголовки ответа: HTTP / 1.1 401

WWW-Аутентификация: область дайджеста = "NOKIA.COM", qop = "auth", nonce = "MTU1MjM3MDk2MDQ2MjpmOWNjYjVmNGU5ODA0ZmY0YWY0MjIxNDlhY21002 **2 = 8) **88 = 8) **288 = 8) **8 X-Content-Type-Options: nosniff X-XSS-защита: 1; Режим = Блок Cache-Control: no-cache, no-store, max-age = 0, обязательно повторная проверка Прагма: без кеша Истекает: 0 X-Frame-Options: DENY

WWW-Аутентификация: область дайджеста = "NOKIA.COM", qop = "auth", nonce = "MTU1MjM3MDk2MDQ2NjoxOTQ4MDhjNzBjYjkyMGI1Y2Q2YjU3OGMyM3O2 = 1016E62E62E62E62E62E62E62E62E62E61E61E61E6 = 66ME2N2 = 66ME2N0 = 1016E6N0 = 1016E6N0 = 1016E6N0 = 1016E6N0 = 1016E2N0 = 1016E6N0 = 1016E2N0 = 1016E2N0 = 1016E2N0 = 1016E2N0 = 1016E2N0 = 1016E2N2 = 1016E2N2 = 1016E2N2 = 1016E2N2 = 1016E1 = 2 Длина содержимого: 0 Дата: вторник, 12 марта 2019 года, 06:08:20 GMT

@EnableWebSecurity

@ Configuration @Составная часть открытый класс WebSecurityConfig расширяет WebSecurityConfigurerAdapter {

@Autowired
DummyUserService userDetail;

@Autowired
DigestAuthenticationFilter digestFilter;

@Autowired
DigestAuthenticationEntryPoint digestEntryPoint;

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

    http.addFilter(digestFilter)              // register digest entry point
    .exceptionHandling().authenticationEntryPoint(digestEntryPoint)     // on exception ask for digest authentication
    .and()
    .authorizeRequests()
    .anyRequest().authenticated()
    .and().csrf().disable();

    http.httpBasic().disable();

}

@Bean
public PasswordEncoder passwordEncoder() {
    return new PasswordEncoder() {
        @Override
        public String encode(CharSequence rawPassword) {
            return rawPassword.toString();
        }
        @Override
        public boolean matches(CharSequence rawPassword, String encodedPassword) {
            return rawPassword.toString().equals(encodedPassword);
        }
    };
}

}

    @Bean
DigestAuthenticationFilter digestFilter( DigestAuthenticationEntryPoint digestAuthenticationEntryPoint,
                                         UserCache digestUserCache, UserDetailsService userDetailsService )
{
    DigestAuthenticationFilter filter = new DigestAuthenticationFilter();
    filter.setAuthenticationEntryPoint( digestAuthenticationEntryPoint );
    filter.setUserDetailsService( userDetailsService );
    filter.setUserCache( digestUserCache );
    return filter;
}

@Bean
UserCache digestUserCache() throws Exception
{
    return new SpringCacheBasedUserCache( new ConcurrentMapCache( "digestUserCache" ) );
}

@Bean
DigestAuthenticationEntryPoint digestAuthenticationEntry()
{
    DigestAuthenticationEntryPoint digestAuthenticationEntry = new DigestAuthenticationEntryPoint();
    digestAuthenticationEntry.setRealmName( "XXX.COM" );
    digestAuthenticationEntry.setKey( "XXX" );
    digestAuthenticationEntry.setNonceValiditySeconds( 60 );
    return digestAuthenticationEntry;
}

Пожалуйста, кто-нибудь может мне помочь. Большое спасибо!

1 Ответ

0 голосов
/ 13 марта 2019

Я решил эту проблему самостоятельно.Для запроса с неверной аутентификацией DigestAuthenticationEntryPoint был вызван дважды как digestFilter, так и exceptionFilter.

Перезаписать DigestAuthenticationEntryPoint:

public class CustomDigestAuthenticationEntryPoint extends DigestAuthenticationEntryPoint
{
    @Override
    public void commence( HttpServletRequest request, HttpServletResponse response,
                          AuthenticationException authException )
        throws IOException, ServletException
    {
        HttpServletResponse httpResponse = ( HttpServletResponse ) response;
        String authHeader = httpResponse.getHeader( "WWW-Authenticate" );
        if( authHeader != null )
        {
            httpResponse.sendError( HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.getReasonPhrase() );
        }
        else
        {
            super.commence( request, httpResponse, authException );
        }
    }
}
...