Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Apache CXF + Spring Security  [new]
Kriptman
Member

Откуда:
Сообщений: 7
Пытаюсь переехать на java, делаю нубский пет-проект. И что-то застопорился на, казалось бы, простом вопросе. Есть soap приложение на apache cxf, авторизацию делаю через заголовки в xml. Хочу прикрутить к этому делу спринговую секьюрити дабы юзать аннотации @RolesAllowed на методах. Но каменный цветок не выходит совершенно.

Настройки эндпоинта:
endpoint.getInInterceptors().add(new SAAJInInterceptor());
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());

Была попытка сделать это через колбэк, но там пароль не достать, да и не решает это проблемы.

Валидатор:
@Service
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);
    }   
}

Тут есть всё, чтобы руками разруливать права и т.д., но хочется заюзать всё-таки спринг и удобные аннотации из коробки.

Конфигурация спринг секьюрити:
@Configuration
@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()
        ;
    }
}

Добавление или удаление inMemoryAuthentication ничего не меняет, так что пропустил.

Аннотации вида @RolesAllowed(Role.USER_ROLE) юзаю на методах класса обозначенного как @WebService.

Если вместо permitAll поставить authenticated, то до валидатора даже не доходит, доступ рубит раньше. Я понимаю, что либо настроил что-то не так, либо надо действовать совершенно по другому. Но как-то не додумаюсь куда гуглить, может кто-нибудь хотя бы направление даст. А то гуглится всякая древняя фигня, которая уже не работает.

Собственно вопрос - а как мне руками сделать аутентификацию в спринге через соап сообщение, чтобы работали аннотации?
3 апр 19, 21:56    [21851846]     Ответить | Цитировать Сообщить модератору
 Re: Apache CXF + Spring Security  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5044
Kriptman, те, кто работали с soap - уже умерли. Не стоит тревожить их души.
3 апр 19, 23:15    [21851887]     Ответить | Цитировать Сообщить модератору
 Re: Apache CXF + Spring Security  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37971
Kriptman,
Под слоем SOAP поместите свой слой спринг типа rest.
4 апр 19, 09:21    [21852046]     Ответить | Цитировать Сообщить модератору
 Re: Apache CXF + Spring Security  [new]
Kriptman
Member

Откуда:
Сообщений: 7
Petro123,

Какое-то странное решение. Оно, скорее всего, будет работать, но выглядит как костыль. Если бы нужно было решение любой ценой, то воспользовался бы, спасибо. Но хотелось бы сделать красиво.

Как я понимаю, у меня проблема в очерёдности фильтров\проверок, но ведь должен быть способ это сконфигурировать?
4 апр 19, 11:38    [21852341]     Ответить | Цитировать Сообщить модератору
 Re: Apache CXF + Spring Security  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37971
Kriptman,
Не думаю что костыль. В шарпе soap это обертка http методов. То есть rest.
Вы в soap меняете протокол одной галкой.
IMHO.
Чем штатная в соап аутентификация не устроила?
4 апр 19, 11:42    [21852348]     Ответить | Цитировать Сообщить модератору
 Re: Apache CXF + Spring Security  [new]
Kriptman
Member

Откуда:
Сообщений: 7
Petro123,
Ну это просто ещё один слой в приложении. На каждый сервис. И каждый новый метод придётся добавлять ещё и там. И пробрасывать все параметры туда-сюда лишний раз. Или я неправильно понял мысль?

Проблема не в проверке пользователя, с этим всё понятно и решено. Штатными апачевскими методами. Я и с политиками извращался, и с коллбекхендлером, в вопросе разобрался более-менее. И куда уж стандартнее, чем аутентификация прямо внутри запроса одним куском? Или я не заметил слона, который всё это делает из коробки?

Проблема в том, что нужно передать эту аутентификацию, прошедшую через cxf, в спринг секьюрити, так чтобы работали аннотации этого самого секьюрити. Чтобы я мог пометить нужные методы нужными ролями (rolesallowed, secured или ещё как) и оно само вжух и полетело. Как это сделать руками вообще без спринга мне понятно. Как это сделать в чисто спринговом рест-приложении тоже понятно.
4 апр 19, 12:23    [21852442]     Ответить | Цитировать Сообщить модератору
 Re: Apache CXF + Spring Security  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37971
Kriptman,
Я так и не понял, что мешает БЕЗ спринга работать с ролями SOAP?
Там нет работы с ролями? Не нашли? Лень? Не можете жить без спринга?
4 апр 19, 12:43    [21852495]     Ответить | Цитировать Сообщить модератору
 Re: Apache CXF + Spring Security  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5611
Kriptman, не читал, но может пригодится: Integrating Spring Security with Apache CXF RESTful web service
4 апр 19, 12:55    [21852535]     Ответить | Цитировать Сообщить модератору
 Re: Apache CXF + Spring Security  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5611
Kachalov
Kriptman, не читал, но может пригодится: Integrating Spring Security with Apache CXF RESTful web service

Ошибся главой: Integrating Spring Security with Apache CXF SOAP based web service
4 апр 19, 12:57    [21852539]     Ответить | Цитировать Сообщить модератору
 Re: Apache CXF + Spring Security  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5611
Kachalov
Kachalov
Kriptman, не читал, но может пригодится: Integrating Spring Security with Apache CXF RESTful web service

Ошибся главой: Integrating Spring Security with Apache CXF SOAP based web service

- фиговую ссылку дал (почитал, там совсем не про то), вот может wss4j решит Вашу проблему
4 апр 19, 13:15    [21852570]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить