2016-08-28 6 views
2

Скрывать поля в JSP/JSTL было легко в соответствии с пользовательскими привилегиями, определяющими реализацию Spring Security. Можно легко написать примерно так:JSON REST API с функцией Spring Security

<%-- Assume message.title requires no privilege --> 
<c:out value="${message.title}" /> 

<%-- Assume message.text requires PRIV_READ_MESSAGE --> 
<security:authorize ifAllGranted="PRIV_READ_MESSAGE"> 
    <c:out value="${message.text}" /> 
</secrurity:authorize> 

Мой вопрос в том, как это сделать, если мы не используем JSP. В моих будущих проектах я хочу использовать простые HTML-файлы с Angular JS, AJAX-запросами и ответами JSON.

Например, я могу создать API, чтобы вернуть сообщение, как это:

GET /api/v1/message/{msgId} 

Если пользователь не имеет привилегий PRIV_READ_MESSAGE, ответ JSON этого API будет как:

{ 
    "messageId": 123, 
    "title": "Sample Message 101" 
} 

Если пользователь имеет эту привилегию, ответ JSON этого API будет следующим:

{ 
    "messageId": 123, 
    "title": "Sample Message 101", 
    "text": "Message Body will be included..." 
} 

Если предположить, что я реализовал следующий весенний контроллер:

@RequestMapping(value = "api/v1/message/{messageId}", method = RequestMethod.GET) 
public ResponseEntity<Message> getMessage(@PathVariable Long messageId) { 
    // use some magic code to fetch Message from DB 
    Message message = null; 

    return new ResponseEntity<>(message, HttpStatus.OK); 
} 

Я не хочу, чтобы добавить, если/иначе мои методы контроллера для того, чтобы проверить, если зарегистрированный пользователь имеет достаточных привилегий или нет. Могу ли я фильтровать поля ответа JSON где-нибудь в соответствии с пользовательскими привилегиями?

Вы можете предположить, что переменная ThreadLocal используется для хранения привилегий пользователя.

ответ

1

Если вы можете использовать Джерси (2.16+), то есть решение вне коробки для вашей проблемы: https://jersey.java.net/documentation/latest/entity-filtering.html#ef.security.annotations http://blog.dejavu.sk/2015/02/04/jerseys-entity-filtering-meets-jackson/

Я не пробовал еще, но это выглядит многообещающе .. .

Как насчет весны (без Джерси)? Я еще не видел никакой информации о подобном механизме в Spring Security/MVC ... Фильтры Spring Security (по умолчанию) не могут применяться к вашим объектам, потому что они не управляются Spring. Однако, вы могли бы попытаться осуществить это с помощью АОП и AspectJ:

https://stackoverflow.com/a/31522654/1545775

Был вопрос GitHub для такого рода функции, но я не знаю, что такое статус:

https://github.com/spring-projects/spring-security/issues/3250

Что вы можете сделать теперь с помощью Spring Security (без какой-либо дополнительной настройки) - это фильтрация списков сущностей (на основе ролей Spring Security). Просто используйте @PostFilter аннотации по вашим защищенным методам (например, методы репозитория). Но если вы решите использовать это решение, вы должны знать о проблемах с производительностью при использовании больших наборов данных.

Смежные вопросы