Spring security — защита запроса с помощью принципа проверки по параметру @RequestParam?

#java #spring #spring-mvc #spring-security #spring-el

#java #spring #spring-mvc #spring-безопасность #spring-el

Вопрос:

Я работаю с Restful API (со многими URL-адресами), используя Spring 3.1.2, и хочу применять фильтры безопасности для каждого запроса, который использует как данные от аутентифицированного пользователя «принципала», так и данные, отправленные запросом.

пример:

проверка идентификатора учетной записи по URL-адресу запроса:

http://www.foo.com/accountRecords?accountId=23

с основными данными principal.accountId = 23 .

Я знаю, что это можно сделать из методов @RequestMapping, но хочу сделать это вне фактического метода, чтобы он был поддерживаемым и настраиваемым без вмешательства в бизнес-логику.

Но я не нашел никаких советов примеров по этому поводу..

Я считаю, что это должно выглядеть примерно так: @PreAuthorize("principal.accountId == requestParam.accountId")

Ответ №1:

Я думаю, вы ищете фильтры для фильтрации запроса и ответа. Для этой цели можно использовать Spring interceptors .

 public class MyInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(false);
        String requestParam = request.getParameter("your request param");
    }
}
  

Наконец, вам необходимо настроить эти перехватчики в вашем context.xml файл:

 <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.example.MyInterceptor" />
        </mvc:interceptor>                
    </mvc:interceptors>
  

Комментарии:

1. Спасибо, я считаю, что перехватчики слишком высокого уровня для меня, в документации Spring перехватчики фильтруются по регулярному выражению и разрешениям, но не имеют доступа к параметрам запроса. Если бы вы могли предоставить пример кода, я был бы признателен.

2. посмотрите на отредактированный ответ, например. Смотрите, вы можете использовать параметры запроса.

3. Я понимаю. хороший пример 🙂 Знаете ли вы, как я могу получить доступ к участнику безопасности (например, имя пользователя и учетная запись) из MyInterceptor?