Во-первых, подумайте о разделении вопросов. Какова цель REST API?
API REST должен предлагать услугу клиенту. Клиент отправляет запрос через протокол REST и получает ответ на запрос. В коде это выглядит примерно так:
@GET
public Response getClientInfo(@QueryParam("clientId") Integer clientId) {
ClientDTO clientDTO = database.getClientInfo(clientId);
return ResponseWrapper.wrap(clientDTO);
}
Теперь вы хотите, чтобы ваш метод REST выполнял ТОЛЬКО это и ничего больше. В противном случае вы бы поставили block-bruteforce-and-spam-logic в свой метод REST, и вы получите беспорядок кода, который не является расширяемым, труднодоступным для версии и т. Д. Если вы хотите изменить свой, например, политики черного списка, вам придется изменить каждый метод REST, и он громоздкий. Если вы хотите проверить вызовы до того, как сделать это с помощью методов REST, взгляните на Filters. Каждый запрос и ответ проходят через цепочку фильтров и могут быть проверены на неправильное использование сервера.
Я не знаю, что ваш стек технологии, но я хотел бы предложить, глядя на эти:
- JBoss AS7.
- DeltaSpike (включает в себя мощные перехватчики, которые будут проверять права пользователя и права выполнения перед выполнением метода REST).
, например:
@LoggedInUser
@GET
public Response getClientInfo(...) {
...
}
Эта безопасность аннотация @LoggedInUser
(который, кстати, можно определить) даст знак перехватчик, чтобы проверить это ограничение безопасности, например,
@Secures (built in annotation)
@LoggedInUser
public boolean hasRight(Identity identity) {
return identity.isLoggedIn(); //or if he is in certain group of users
}
- контекст и контекст внедрения зависимостей (используемый в DeltaSpike).
- JBoss Filters (цепь фильтров, в которой вы можете создать свой собственный фильтр, который, например, проверяет, пытается ли какой-либо IP-адрес несколько вызовов в течение короткого периода времени - 10 строк кода).
Пример фильтра
@Startup
@ApplicationScoped
@Filter(around= "org.jboss.seam.web.ajax4jsfFilter")
public class IPTrackerFilter extends AbstractFilter {
//IPTracker is your @ApplicationScoped bean that remembers all IP addresses accessing the application.
@Inject
private IPTracker fIPTracker;
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
if (!(req instanceof HttpServletRequest)) {
chain.doFilter(req, res);
return;
}
final String ipAddress= ((HttpServletRequest)req).getRemoteAddr();
if (fIPTracker.isBlackListed(ipAddress)) {
//implement error message here
sendErrorMessage(response);
return;
} else {
//all good, continue
chain.doFilter(req, res);
}
}
}
PS. Я дал вам ссылку для DeltaSpike, для других очень легко найти. Кроме того, если вы обнаружите, что DeltaSpike скрывается, попробуйте с JBoss Seam Security Framework.
Спасибо за ваш комментарий. Технология, которую мы используем, представляет собой небольшую структуру, построенную на вершине Джерси. Мы обеспечили звонки, доступные для зарегистрированных пользователей, к сожалению, есть некоторые звонки, которые разрешены для анонимных пользователей (например, регистрация). Они должны быть каким-то образом защищены от спамеров, ботов, оскорбительных пользователей и т. Д. Я прочитаю ссылки, которые вы предоставили. –
Затем взгляните на 'ContainerRequestFilter'. – darijan