Вам необходимо реализовать пользовательскую аутентификацию весной. Я сделал то же самое, но у меня был БД, как:
fb_email_address | user_id | other_fields ...
Вы должны создать эти классы:
@Component
class TokenAuthenticationFilter extends OncePerRequestFilter {
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain) {
String theToken = request.getParameter('theToken');
TokenAuthentication tokenAuth = new TokenAuthentication(theToken)
SecurityContextHolder.getContext().setAuthentication(tokenAuth)
}
}
Вам необходимо добавить провайдера аутентификации в систему безопасности Spring:
@Configuration
@EnableWebSecurity
class WebConfigHolder extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {
@Autowired private TokenAuthenticationProvider tokenAuthenticationProvider
@Override
@Autowired
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(tokenAuthenticationProvider)
}
}
Реализация поставщика аутентификации, который фактически проверяет, является ли токен действительным.
@Component
class TokenAuthenticationProvider implements AuthenticationProvider {
//called by provider manager at some point during execution of security filters, I think
//it's the security api's job to call this
//the fbauthentication we create in our fbauthenticationfilter gets passed into this
@Override
@Transactional
Authentication authenticate(Authentication auth) {
TokenAuthentication tokenAuthentication = (TokenAuthentication) auth;
String theToken = auth.getThetoken();
boolean theTokenIsInDB = ///CHECK TO SEE IF TOKEN IS IN DB
if(theTokenIsInDB) {
TokenAuthentication t = new TokenAuthentication();
t.setAuthenticated(true);
return t;
} else {
throw new BadCredentialsException("Could not find user");
}
}
@Override
boolean supports(Class<?> authentication) {
boolean ret = TokenAuthentication.isAssignableFrom(authentication)
return TokenAuthentication.isAssignableFrom(authentication)
}
}
Вам необходим простой класс аутентификации, который является просто объектом, который используется для хранения учетных данных, в то время как пружина ожидает, пока поток достигнет фильтра безопасности пружины; как только он попадает в этот фильтр, он передает объекты аутентификации поставщикам, которые их поддерживают. Это позволяет использовать несколько методов аутентификации, таких как FB, Google, пользовательские токены и т. Д. В моем приложении я использую токены FB, а в своем провайдере проверяю, соответствует ли токен FB авторизованному адресу электронной почты в моем белом списке адрес электронной почты. Если это так, пользователь получает доступ к моему приложению.
public class TokenAuthentication extends Authentication{
String token;
boolean isAuthenticated = false;
public TokenAuthentication(String theToken) { this.token = theToken;}
//getters and setters
}
Что этот код делает, когда кто-то обращается к вашему API, например / api / person / get? TheToken = 132x8591dkkad8FjajamM9
- Созданный вами фильтр запускается при каждом запросе. Он проверяет, был ли передан токен, и добавляет TokenAuthentication к безопасности Spring.
- В какой-то момент в цепочке фильтров будет запущен весенний фильтр безопасности, и он увидит, что была создана TokenAuthentication, и будет искать поставщика, который может выполнить аутентификацию на этом. Это ваш провайдер TokenAuthenticationProvider.
- TokenAuthenticationProvider выполняет фактическую аутентификацию. Если он возвращает объект аутентификации, для которого isAuthenticated имеет значение true, то пользователю будет разрешен доступ к этому вызову API.
- После аутентификации пользователю не нужно снова передавать theToken до тех пор, пока его куки не будут удалены или вы не сделаете его сеанс недействительным. Таким образом, он может вызвать / api / person без параметров запроса для остальной части своего взаимодействия. Это связано с тем, что весной аутентификация сохраняется как данные в рамках сеанса.
Надеюсь, это поможет. Дайте мне знать, если что-то пропало.