Сбой аутентификации Spring-boot Digest с использованием фильтра Digest - PullRequest
0 голосов
/ 04 октября 2018

Я новичок в этой технологии.Я пытаюсь реализовать дайджест-аутентификацию для моего приложения Springboot.Я получаю сообщение об ошибке ниже, когда пытаюсь вызвать приложение: не существует PasswordEncoder, сопоставленного для идентификатора \ "null \" "," path ":" / countryId / "} * Закрытие соединения 0

curlКоманда, которую я использую для вызова: curl -iv --digest -u test: 5f4dcc3b5aa765d61d8327deb882cf99 -d {"CountryCode": "INDIA"} http://localhost:9090/countryId/

Детали классов:

package com.sg.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserCache;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.authentication.www.DigestAuthenticationFilter;
import org.springframework.stereotype.Component;

@Component
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    CustomDigestAuthenticationEntryPoint customDigestAuthenticationEntryPoint;

    /*@Bean
    public BCryptPasswordEncoder encoder() {
        return new BCryptPasswordEncoder();
    }*/

@Bean
public UserDetailsService userDetailsServiceBean()
{
    InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
    manager.createUser(User.withUsername("test").password("{noop}password").roles("USER").build());
    return manager;

}

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

        http.csrf().disable().authorizeRequests().antMatchers("/hello/**").permitAll().anyRequest().authenticated()
                .and().exceptionHandling().authenticationEntryPoint(customDigestAuthenticationEntryPoint).and()
                .addFilter(digestAuthenticationFilter());
    }

    //@Bean
    DigestAuthenticationFilter digestAuthenticationFilter() throws Exception {
        DigestAuthenticationFilter digestAuthenticationFilter = new DigestAuthenticationFilter();
        digestAuthenticationFilter.setUserDetailsService(userDetailsServiceBean());
        digestAuthenticationFilter.setAuthenticationEntryPoint(customDigestAuthenticationEntryPoint);
        return digestAuthenticationFilter;
    }



    }

package com.sg.config;

import org.springframework.security.web.authentication.www.DigestAuthenticationEntryPoint;
import org.springframework.stereotype.Component;

@Component
public class CustomDigestAuthenticationEntryPoint extends DigestAuthenticationEntryPoint {

    @Override
    public void afterPropertiesSet() throws Exception {
        setRealmName("Digest-Realm");
        setKey("MySecureKey");
        setNonceValiditySeconds(300);
        super.afterPropertiesSet();
    }



}

1 Ответ

0 голосов
/ 19 декабря 2018

Я решил проблему.Позвольте мне сначала объяснить, что пошло не так, в текущей безопасности Spring вы не можете использовать простой текстовый пароль, поэтому необходимо придерживаться некоторой логики шифрования.Но, к сожалению, дайджест не работает с зашифрованным паролем.Я нашел обходной путь, вместо того, чтобы использовать Бин (Bycrypt), я непосредственно реализовал интерфейс PasswordEncoder, таким образом, он должен иметь возможность хранить простой текстовый пароль.

@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);
        }
    };
}
...