JAX-RS: Как защитить конечные точки REST?

Я использую JBoss AS и JAX-RS для создания конечных точек REST.

Давайте скажем, что мой класс выглядит как

@Path("/users")
public class UserResource {


  @GET
  public Response getAccount() {
    return "hello";
  }
}

Теперь getAccount не аутентифицируется в настоящий момент

Требуются
- Я хотел бы добавить аутентификацию, чтобы при обращении к коду getAccount пользователь аутентифицировался
- Я бы хотел, чтобы аутентификация управлялась аннотациями вместо XML-конфигураций, если это вообще возможно. - Я хотел бы сделать сравнение базы данных, чтобы узнать, действительно ли пользователь

Проблема
- Я никогда этого не делал, поэтому я понятия не имею, как его реализовать. - Я много гугл и нашел примеры из Джерси.

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

Прошу вас посоветоваться с одним простым рабочим примером, и я попытаюсь расширить его оттуда.

Ответ 1

Я решил это с помощью следующего кода.

note Механизм токена будет обновляться после того, как я это сделаю.

Я решил это, модифицировав перехватчик, который у меня есть, следующий код

Аннотация

@Inherited
@InterceptorBinding
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface SecurityChecked {

}

Класс ресурсов

public class SecureResource {

    @GET
    @SecurityChecked
    public Response getUser() {
        return Response.ok("authenticated successfully!").build();
    }
}

Класс перехватчика

@Interceptor
@Provider
@ServerInterceptor
@SecurityChecked
public class SecurityCheckInterceptor implements PreProcessInterceptor, AcceptedByMethod {
    private static final Logger LOGGER = LoggerFactory.getLogger(SecurityCheckInterceptor.class);

    @Nullable
    @Override
    public ServerResponse preProcess(final HttpRequest request, final ResourceMethod method) throws Failure, WebApplicationException {
        final List<String> authToken = request.getHttpHeaders().getRequestHeader("X-AUTH");

        if (authToken == null || !isValidToken(authToken.get(0))) {
            final ServerResponse serverResponse = new ServerResponse();
            serverResponse.setStatus(Response.Status.UNAUTHORIZED.getStatusCode());
            return serverResponse;
        }

        return null;
    }

    private static boolean isValidToken(@Nonnull final String authToken) {
        LOGGER.info("validating token: " + authToken);
        return true;
    }

    @SuppressWarnings("rawtypes")
    @Override
    public boolean accept(final Class declaring, final Method method) {
        // return declaring.isAnnotationPresent(SecurityChecked.class); // if annotation on class
        return method.isAnnotationPresent(SecurityChecked.class);
    }
}

а затем я запускаю свои тесты интеграции, развертывая класс ресурсов в JBoss и выдавая следующие команды в командной строке

curl --header 'X-AUTH: 1a629d035831feadOOO4uFReLyEW8aTmrCS' http://localhost:8080/market-1.0-SNAPSHOT/rest/login
curl --header 'InvalidHeader: InvalidHeaderValue' http://localhost:8080/market-1.0-SNAPSHOT/rest/login

Ответ 2

Вам нужна конфигурация безопасности без состояния Spring перед конечными точками JAX RS. Я рассмотрел точную проблему, которую вы пытаетесь решить, но у меня нет моего собственного кода для обмена.

Вот один проект, который сделал то, что вы просите, какой-то мудрый человек сделал все для вас;)

https://github.com/philipsorst/angular-rest-springsecurity

Что такое магия?

  • У вас есть один незащищенный URL-адрес, который выполняет аутентификацию, и также задайте роли пользователя.
  • Затем вы возвращаете какой-то токен, поместите его в кеш, который будет ожидаться при каждом последующем вызове.
  • После нового запроса на другие защищенные ресурсы вы проверите, присутствует ли токен в вашем хранилище кеша/сеанса (вам нужен какой-то механизм для отслеживания действительных токенов)
  • Если токен resent и действителен, вы выполняете программный вход в систему Spring Security, который гарантирует, что вы можете использовать все функции безопасности Spring, (аннотации, теги JSTL и т.д.)!
  • После прохождения проверки маркера вы получите зарегистрированные данные пользователя в своих контроллерах (а также ресурсы JAX RS) для дальнейшего обеспечения безопасности.
  • Если токен недействителен или отсутствует, он будет захвачен конечной точкой отказа, которая вернет соответствующий ответ (401)

Обратитесь к ссылке, чтобы понять, как настроен режим бездействия Spring. https://github.com/philipsorst/angular-rest-springsecurity/blob/master/src/main/resources/context.xml

Узнайте, как пользователь проверяется в первый раз и генерируется токен. https://github.com/philipsorst/angular-rest-springsecurity/blob/master/src/main/java/net/dontdrinkandroot/example/angularrestspringsecurity/rest/resources/UserResource.java

Вот класс, в котором программный логин выполняется по каждому запросу после токена проверить.. https://github.com/philipsorst/angular-rest-springsecurity/blob/master/src/main/java/net/dontdrinkandroot/example/angularrestspringsecurity/rest/AuthenticationTokenProcessingFilter.java