Предоставена власт срещу роля в пролетната сигурност

1. Общ преглед

В тази бърза статия ще обясним фината, но съществена разлика между роля и предоставен авторитет в Spring Security . За по-подробна информация за ролите и авторитетите вижте статията тук.

2. GrantedAuthority

В Spring Security можем да възприемаме всеки GrantedAuthority като индивидуална привилегия . Примерите могат да включват READ_AUTHORITY , WRITE_PRIVILEGE или дори CAN_EXECUTE_AS_ROOT . Важното е да се разбере, че името е произволно .

Когато използваме GrantedAuthority директно, например чрез използването на израз като hasAuthority ('READ_AUTHORITY'), ние ограничаваме достъпа по фин начин .

Както вероятно разбирате, можем да се позовем на понятието авторитет, като използваме и привилегия .

3. Роля като авторитет

По същия начин, в Spring Security, можем да мислим за всяка роля като грубо зърнен GrantedAuthority, който е представен като низ и с префикс „ ROLE . Когато използваме роля директно, например чрез израз като hasRole („ADMIN“) , ограничаваме достъпа по груб начин.

Струва си да се отбележи, че по подразбиране префиксът „ ROLE“ е конфигурируем, но обяснението как да направите това е извън обхвата на тази статия.

Основната разлика между тези две е семантиката, която придаваме на начина, по който използваме функцията. За рамката разликата е минимална - и по същество се справя с тях по абсолютно същия начин.

4. Роля като контейнер

Сега, след като видяхме как рамката използва концепцията за ролята , нека също така бързо да обсъдим алтернатива - и това е използването на роли като контейнери на органи / привилегии .

Това е подход на по-високо ниво към ролите - което ги прави по-ориентирана към бизнеса, а не ориентирана към изпълнението.

Рамката Spring Security не дава никакви насоки по отношение на това как трябва да използваме концепцията, така че изборът е изцяло специфичен за изпълнението.

5. Пролетна конфигурация на защитата

Можем да демонстрираме задълбочено изискване за оторизация, като ограничим достъпа до / protectedbyauthority на потребители с READ_AUTHORITY .

Можем да докажем грубо задълбочено изискване за разрешаване, като ограничим достъпа до / protectedbyrole на потребители с ROLE_USER .

Нека конфигурираме такъв сценарий в нашата конфигурация за сигурност:

@Override protected void configure(HttpSecurity http) throws Exception { // ... .antMatchers("/protectedbyrole").hasRole("USER") .antMatchers("/protectedbyauthority").hasAuthority("READ_PRIVILEGE") // ... }

6. Simple Data Init

Сега, когато разбираме основните концепции по-добре, нека поговорим за създаването на някои данни за настройка, когато приложението се стартира.

Това е, разбира се, много прост начин да се направи това, за да се удари в земята с някои потребители на предварителни тестове по време на разработката - не начинът, по който трябва да обработвате данните в производството.

Ще слушаме събитието за опресняване на контекста:

@Override @Transactional public void onApplicationEvent(ContextRefreshedEvent event) { MyPrivilege readPrivilege = createPrivilegeIfNotFound("READ_PRIVILEGE"); MyPrivilege writePrivilege = createPrivilegeIfNotFound("WRITE_PRIVILEGE"); }

Реалното изпълнение тук всъщност няма значение - и като цяло зависи от решението за устойчивост, което използвате. Основното е - ние продължаваме да използваме органите, които използваме в кода.

7. UserDetailsService

Нашето внедряване на UserDetailsService е мястото, където се извършва картографирането на органа . След като потребителят се удостовери, нашият метод getAuthorities () попълва и връща обект UserDetails :

private Collection getAuthorities( Collection roles) { List authorities = new ArrayList(); for (Role role: roles) { authorities.add(new SimpleGrantedAuthority(role.getName())); role.getPrivileges().stream() .map(p -> new SimpleGrantedAuthority(p.getName())) .forEach(authorities::add); } return authorities; }

8. Изпълнение и тестване на примера

Можем да изпълним примерното приложение на RolesAuthoritiesApplication Java, намерено в проекта GitHub.

За да видим оторизацията, базирана на роли, в действие, трябва:

  • Достъп // localhost: 8082 / protectedbyrole
  • Удостоверява се като [имейл защитен] (паролата е „потребител“ )
  • Обърнете внимание на успешно упълномощаване
  • Достъп // localhost: 8082 / protectedbyauthority
  • Обърнете внимание на неуспешно упълномощаване

За да видим упълномощаването, основано на власт, в действие, трябва да излезем от приложението и след това:

  • Достъп // localhost: 8082 / protectedbyauthority
  • Удостоверете се като [имейл защитен] / администратор
  • Обърнете внимание на успешно упълномощаване
  • Достъп // localhsot: 8082 / protectedbyrole
  • Обърнете внимание на неуспешно упълномощаване

9. Заключение

В този бърз урок разгледахме фината, но значителна разлика между роля и предоставен авторитет в Spring Security.