2015-06-08 4 views
0

Я пытаюсь настроить безопасность в новом приложении Spring Boot MVC. Я пытаюсь сделать это без конфигурации XML, только Java. В настоящее время мне удалось получить защиту на основе ролей, используя аннотацию @Secured для каждого из моих методов @RequestMapping.Spring Boot MVC неграмотная защита

мне также нужно добавить безопасности на основе объекта, например:

Пользователь был предоставлен доступ к виджету ID 456 и 689, и не в состоянии получить доступ к любой другой виджет. Это явно не то, что может быть достигнуто с помощью обеспечения безопасности на основе ролей, поскольку теоретически может быть неограниченное количество различных виджетов, к которым могут иметь доступ разные пользователи.

Для этого мне нужно было создать новые реализации AccessDecisionVoter и GrantedAuthority, которые определяют, имеет ли пользователь права доступа к виджету.

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

ответ

1

Возможно, для вас будет достаточно @PreAuthorize или @PostAuthorize, это зависит от того, что именно вам нужно. Вы можете попробовать что-н, как это:

@PostAuthorize("returnObject.widget.owner.id == principal.id") 
public Widget getWidgetById(long id) { 
    // ... 
return widget; 
} 


UPDATE:
Вы можете использовать Pre/Post Authroize поскольку Spring Security 3.0 и, как вы сказали, что обеспечивает расширенные возможности более @Secured. В до/после аннотации вы можете использовать SpeL (язык выражения Spring).

Если вы хотите использовать пре/пост аннотаций и нужно это в конфигурации:

<global-method-security pre-post-annotations="enabled" /> 

Пример Пусть пользователь с ROLE_USER добавить сообщения с текстовым полем содержат менее 140 символов и пользователей с ролью ROLE_PREMIUM добавить сообщения любой длиной

@PreAuthorize("(hasRole('ROLE_USER') and #post.text.length() <= 140) 
    or hasRole('ROLE_PREMIUM')") 


Если какие-либо из аннотаций Spring Security и Spel не препятствует вам сделать требуемое правило доступа к его также можно использовать касты методы ОМ (но предварительно заблокировать я на самом деле не знаю, если это хорошая практика):

@PreAuthorize("hasRole('ROLE_ADMIN') 
or @mySecurityService.isPostOwner(#post_id, principal.id))") 
+0

Я смотрел в Pre/PostAuthorize аннотации некоторые, и я должен спросить, есть ли какая-либо причина использовать Обеспеченные аннотацию? Кажется, что PreAuthorize может делать все и больше, чем обеспечен, или я чего-то не хватает? – user2805089

+0

@ user2805089 проверить обновленный ответ – jgr

+0

Для без XML мне также необходимо добавить в мою конфигурацию следующую аннотацию: EnableGlobalMethodSecurity (prePostEnabled = true) – user2805089

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