Apache CXF аутентификация + весенняя безопасность - PullRequest
0 голосов
/ 04 апреля 2019

Я хочу использовать аннотацию @RolesAllowed (или аналогичную) в моем SOAP-приложении на основе Apache-CXF.Но я не понимаю, как настроить Spring Security для этого.

Я хочу пройти проверку подлинности из заголовка XML в сообщениях SOAP.

Конфигурация безопасности конечной точки:

Map<String, Object> props = new HashMap<>();
props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
props.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
endpoint.getInInterceptors().add(new WSS4JInInterceptor(props));

endpoint.getProperties().put("ws-security.validate.token", false);
endpoint.getProperties().put("ws-security.ut.no-callbacks", true);
endpoint.getProperties().put("ws-security.ut.validator", 
                             CredentialValidator.class.getName());

Также пытался использовать CallbackHandler.Те же результаты.

Валидатор:

public class CredentialValidator extends UsernameTokenValidator {
    @Override
    public Credential validate(Credential credential, RequestData data)
                  throws WSSecurityException {
        String userName = credential.getUsernametoken().getName();
        String password = credential.getUsernametoken().getPassword();

        List<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(new SimpleGrantedAuthority(Role.USER_ROLE));

        PreAuthenticatedAuthenticationToken token = new 
           PreAuthenticatedAuthenticationToken(
               userName, 
               password, 
               authorities);
        SecurityContextHolder.getContext().setAuthentication(token);
    }   
}

Конфигурация Spring Security:

@EnableWebSecurity
@EnableGlobalMethodSecurity(jsr250Enabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
          .antMatchers(HttpMethod.POST, "/services/**")
          .permitAll()
        ;
    }
}

Если я использую allowAll () в конфигурации, тогда все запросы проходят, но аннотации не выполняютсят работа.Если я использую authenticated (), я получаю «доступ запрещен» до того, как мой валидатор заработает.

Я использую аннотации @AllowedRoles в моем интерфейсе @WebService.

1 Ответ

0 голосов
/ 06 апреля 2019

Вместо использования CredentialValidator вы можете попробовать использовать TokenFilter.Ваша конфигурация Spring Security должна выглядеть следующим образом:

@EnableWebSecurity
@EnableGlobalMethodSecurity(jsr250Enabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public BCryptPasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .antMatchers(HttpMethod.POST, "/services/**")
      .authenticated()
      .addFilterBefore(tokenFilterBean(), UsernamePasswordAuthenticationFilter.class);
  }

@Bean
public TokenFilter tokenFilterBean() {
    return new TokenFilter();
  }    

}    

Полный рабочий проект вы можете найти в моем репо: repo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...