Получение 403 при доступе к защищенным конечным точкам в SpringBoot, даже если роли совпадают и учетные данные пользователя верны - PullRequest
0 голосов
/ 14 января 2019

Ниже приведен класс конфигурации безопасности: -

@EnableWebSecurity
public class SecurityManager extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        super.configure(auth);
    }

    @Bean
    @Override
    public UserDetailsService userDetailsService() {

        UserDetails user=User.builder().username("user").password(passwordEncoder().encode("secret")).
                roles("USER").build();
        UserDetails userAdmin=User.builder().username("admin").password(passwordEncoder().encode("secret")).
                roles("ADMIN").build();
        return new InMemoryUserDetailsManager(user,userAdmin);
    }
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests()
                .antMatchers("/hello*").hasAnyRole("USER","ADMIN");
    }
}  

Ниже находится контроллер, к которому я обращаюсь:

@RestController
public class DemoController {

    @RequestMapping(value="/helloworld",method= RequestMethod.GET)
    public String sampleGetter()
    {
        return "HelloWorld";
    }

    @RequestMapping(value="/helloinnerclass",method= RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
    public InnerClass sampleInnerGetter()
    {
        return new InnerClass("Title","Value");
    }
    class InnerClass
    {
        String title;
        String value;

        public InnerClass(String title, String value) {
            this.title = title;
            this.value = value;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }

}

При запуске вышеупомянутых конечных точек через почтальона я получаю код состояния 403. Ниже приведен скриншот ошибки: - enter image description here

Я не упомянул ничего, что касается безопасности, в файле свойств в проекте, поэтому я уверен, что базовая безопасность не обрабатывается в файле свойств.

1 Ответ

0 голосов
/ 14 января 2019

Вы пытались включить httpBasic в своем фильтре безопасности?

@Override
protected void configure(HttpSecurity http) throws Exception {
        .csrf().disable()
        .authorizeRequests()
        .antMatchers("/hello*").hasAnyRole("USER","ADMIN")
        .and()
        .httpBasic();
}

Я создал целый пример проекта , который использует как basic, так и formLogin

Конфигурация безопасности похожа на вашу, но я предпочитаю не показывать пароли в виде открытого текста в реальном приложении

@Bean
public PasswordEncoder passwordEncoder(){
    return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}

@Bean
public UserDetailsService userDetailsService() {
    return new InMemoryUserDetailsManager(
        builder()
            .username("user")
            .password("{bcrypt}$2a$10$C8c78G3SRJpy268vInPUFu.3lcNHG9SaNAPdSaIOy.1TJIio0cmTK")
            .roles("USER")
            .build(),
        builder()
            .username("admin")
            .password("{bcrypt}$2a$10$XvWhl0acx2D2hvpOPd/rPuPA48nQGxOFom1NqhxNN9ST1p9lla3bG")
            .roles("ADMIN")
            .build()
    );
}


@Override
protected void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    http
        //application security
        .authorizeRequests()
            .mvcMatchers("/non-secure/**").permitAll()
            .anyRequest().hasAnyRole("ADMIN","USER")
            .and()
        .httpBasic()
            .and()
        .formLogin()
            .and()
    ;
    // @formatter:on
}

и мы можем продемонстрировать с помощью простого теста , что он работает

@Test
@DisplayName("user / 123 basic authentication")
void userBasic() throws Exception {
    mvc.perform(
        get("/secure")
            .header("Authorization", "Basic " + Base64.encodeBase64String("user:123".getBytes()))
    )
        .andExpect(authenticated())
        .andExpect(status().isOk())
    ;
}

Я написал простой тест , который закодировал мои пароли

@Test
void printPasswords() {
    System.out.println("123 = "+passwordEncoder.encode("123"));
    System.out.println("password = "+passwordEncoder.encode("password"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...