2016-07-26 12 views
2

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

Ограничения: Мы не делаем, чтобы узнать у пользователя имя пользователя и пароль. мы проверяем подлинность с помощью «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); 
    } 


} 

ответ

1

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

, пожалуйста, посмотрите на what this filter does and how it works

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

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

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

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