пружинная защита идентифицируется токеном - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть приложение, и я хочу создать соединение с моим rest-api.

Каждый пользователь получит «токен», который будет автоматически обновляться Google и Co. В своих запросах я отправлю токен, и если он может быть разрешен пользователю, на запрос следует ответить, в противном случае, если он не обновлен, я просто хочу отбросить запрос и вернуть ошибку.

Есть ли еще какие-нибудь возможности?

Спасибо за вашу помощь!

Текущий запуск:

https://gist.github.com/PascalKu/97bca9506ad4f31c9e13f8fe8973d75b

1 Ответ

0 голосов
/ 01 ноября 2018

Вам необходимо реализовать пользовательскую аутентификацию весной. Я сделал то же самое, но у меня был БД, как:

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

  1. Созданный вами фильтр запускается при каждом запросе. Он проверяет, был ли передан токен, и добавляет TokenAuthentication к безопасности Spring.
  2. В какой-то момент в цепочке фильтров будет запущен весенний фильтр безопасности, и он увидит, что была создана TokenAuthentication, и будет искать поставщика, который может выполнить аутентификацию на этом. Это ваш провайдер TokenAuthenticationProvider.
  3. TokenAuthenticationProvider выполняет фактическую аутентификацию. Если он возвращает объект аутентификации, для которого isAuthenticated имеет значение true, то пользователю будет разрешен доступ к этому вызову API.
  4. После аутентификации пользователю не нужно снова передавать theToken до тех пор, пока его куки не будут удалены или вы не сделаете его сеанс недействительным. Таким образом, он может вызвать / api / person без параметров запроса для остальной части своего взаимодействия. Это связано с тем, что весной аутентификация сохраняется как данные в рамках сеанса.

Надеюсь, это поможет. Дайте мне знать, если что-то пропало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...