2013-09-30 4 views
1

Я пытаюсь понять некоторый весовой код безопасности. Я новичок в Spring Security, и я думаю, что здесь у меня отсутствует что-то основное.@PreAuthorize Аннотации роли безопасности

У меня есть, что аннотация на одном из классов:

@Controller 
@RequestMapping("/download-resource") 
@PreAuthorize(value="hasRole('LINKS_ADMIN')") 
public class DownloadResourcesController extends BaseHtmlController 
{..} 

Я читал о @PreAuthorize, и это логично. Я все еще не мог понять, откуда Spring Security извлекает эту определенную строку ролей: 'LINKS_ADMIN'. Где это определено?

спасибо, луч.

+1

Это может быть то, что вы хотите ... Это роли, которые используются в вашем приложении и могут быть выбраны вами. В общем случае они назначаются пользователю. –

+0

Но я посмотрел весь проект на этот термин - LINKS_ADMIN. couldnt найти любое объявление об этом. – rayman

+0

У пользователя есть роли, весенняя безопасность проверяет эти роли. Содержимое внутри тега '@ PreAuthorize' - это метаданные для проверки текущего пользователя. Если у пользователя нет этой роли, он отказывает в доступе. Нет времени компиляции, проверяющего только время выполнения, если у вас нет этой роли в вашей системе, она компилируется и развертывается нормально, однако никто не имеет доступа. –

ответ

3

Эти роли - это роли (полномочия), которые вы назначаете UserDetails, когда пользователь входит в систему. Они будут возвращены с помощью реализации Authentication.

Это одна из форм Collection<? extends GrantedAuthority>, обычно используется SimpleGrantedAuthority.

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

for (Group group : groups) { 
     grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_" + group.getName().toUpperCase())); 
    } 

Так что, если у меня есть группы под названием «Admin», «Пользователь» и «Репортер» теперь я могу проверить has_role('ROLE_ADMIN'), has_role('ROLE_USER') и has_role('ROLE_REPORTER')

 

Под капотом он извлекается из

SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 

, где getAuthentication() возвращает экземпляр Authentication я связан выше, и вы захватываете власти с этого объекта.

+1

В качестве примечания, эти имена роликов идеально определяются в константах времени компиляции, таких как 'public static final String' в подклассах разных классов 'Role' или в качестве значений enum. Это предотвращает множество головных болей от опечаток строк. – chrylis

+1

@chrylis yes, с приложением 'stringly typed' может привести к некоторым ошибкам. В идеале, власти также не будут основываться непосредственно на именах групп, поскольку они меняются, и расширить доступ позже. Часто бывает лучше иметь привилегии, которые могут предоставляться группам, и иметь их в качестве констант в коде. – Matsemann

+0

У меня есть класс с перечислениями, который содержит роль LINKS_ADMIN. но как весенняя безопасность делает ссылку?где он определен? Я редактировал мой вопрос – rayman

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