Spring security 4. JSON REST с настраиваемой аутентификацией и авторизацией

Мы разрабатываем Spring 4 REST/JSON API, но нам нужна настраиваемая служба аутентификации для аутентификации в сторонней службе.

ограничения: мы не запрашиваем у пользователя имя пользователя/пароль. мы аутентифицируемся с помощью «cookie» (отправляем с инициатором запроса). И нам нужен этот процесс аутентификации в фоновом режиме. (Может показаться странным, но это так).

мы могли бы реализовать это с помощью регистрации пользовательских фильтров запросов аутентификации/авторизации. но это заставило нас потерять силу модуля весенней «авторизации», который мы планируем использовать впоследствии.

Итак, что мы делали до сих пор, написали собственный WebSecurityConfigurerAdapter с нашими собственными пользовательскими AuthenticationProvider и UserDetailsService, но эта конфигурация, похоже, не работает.

приложение не входит внутрь AuthenticationProvider.authenticate

вот такая конфигурация у нас была.

AuthenticationProvider.java:

@Service
public class AuthenticationService implements AuthenticationProvider, UserDetailsService {

        @Override
    public Authentication authenticate(Authentication auth) throws AuthenticationException {
        // DOESN'T ENTER THIS FUNCTION
        // do authentication stuff
    }


    @Override
    public boolean supports(Class<?> authentication) {
        // JUST FOR TESTING
        return true;
    }


    @Override
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException {

        // DOESN'T ENTER THIS METHOD
        return null;
    }
}

SecurityConfig.java:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private static final Logger LOGGER = LoggerFactory.getLogger(SecurityConfig.class);

    @Autowired
    private AuthenticationService authService;

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/ignoredURL/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable() //HTTP with Disable CSRF
                .authorizeRequests()
                    .antMatchers("/api/XYZ/**").hasRole("ADMIN")
                    .anyRequest().authenticated();
        // adding ".httpBasic()" automatically prompts user for username/password
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // THIS IS NOT TYPO, I use one service implements both interfaces.
        auth.userDetailsService(authService);
        auth.authenticationProvider(authService);
    }


}

person Mohamed Kamal    schedule 26.07.2016    source источник


Ответы (1)


Исправлено путем добавления еще 2 классов (фильтр, расширяющий AbstractPreAuthenticatedProcessingFilter, и другой класс CustomUser реализует UserDetails), а затем сделал мои AuthenticaitonService реализует spring UserDetailsService вот подробности:

пожалуйста, взгляните на что делает этот фильтр и как он работает

1- Создать AbcFilter удлиняет пружину AbstractPreAuthenticatedProcessingFilter

2- Переопределить «getPreAuthenticatedPrincipal». Этот метод извлекает значение cookie и возвращает его. (Какой бы объект вы ни возвращали, это то, что вы получаете в качестве параметра в UserDetailsService.loadUserByUsername).

3- Модифицировал мой сервис для реализации spring UserDetailsServiceand внутри loadUserByUsername сделал здесь всю логику аутентификации и установил всех зарегистрированных пользователей в объекте CustomUser. Затем верните его.

4- Всякий раз, когда запрос соответствует /api/XYZ/**, Spring будет вызывать вашу CustomUser.getAuthorities и пытаться найти там роль ADMIN.

person Mohamed Kamal    schedule 05.08.2016