Мы разрабатываем 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);
}
}