Spring Security Expressions - пример hasRole

Spring Security Expressions - пример hasRole

1. обзор

Spring Security предоставляет большое разнообразие выражений с использованием мощного языка выражений Spring (SpEL). Большинство этих выражений безопасности оцениваются по контекстному объекту -the currently authenticated principal.

Оценка этих выражений выполняетсяSecurityExpressionRoot, который обеспечивает основу как для веб-безопасности, так и для безопасности на уровне методов.

Возможность использовать выраженияSpEL в качестве механизма авторизации была представлена ​​в Spring Security 3.0 и продолжена в Spring Security 4.x. Полный список выражений в Spring Security можно найти вthis guide.

Дальнейшее чтение:

Весенняя безопасность с Thymeleaf

Краткое руководство по интеграции Spring Security и Thymeleaf

Read more

Введение в безопасность методов Spring

Руководство по безопасности на уровне методов с использованием среды безопасности Spring.

Read more

Двухфакторная аутентификация с Spring Security

Практическая реализация двухфакторной аутентификации с помощью Spring Security 4 и мобильного приложения Google Authenticator.

Read more

2. Веб-авторизация

Spring Security предоставляет два типа веб-авторизации - защитаfull page based on the URL и условное отображениеparts of a JSP page на основе правил безопасности.

2.1. Пример авторизации полной страницы

Если для элементаhttp включены выражения, шаблон URL-адреса можно защитить следующим образом:


    
    ...

Использование конфигурации Java:

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .authorizeRequests()
          .antMatchers("/admin/**").hasRole("ADMIN");
    }
    ...
}

Spring Security автоматически добавляет к любой роли префиксROLE_.

ВыражениеhasRole используется здесь, чтобы проверить, имеет ли текущий аутентифицированный участник указанные полномочия.

2.2. В примере авторизации страницы

Второй вид веб-авторизации - это условное отображение некоторой части страницы JSP на основе оценки выражения безопасности.

Добавим требуемыйdependency дляSpring Security JSP taglib support вpom.xml:


    org.springframework.security
    spring-security-taglibs
    5.0.5.RELEASE

Для использования пространства именsecurity на странице должна быть включена поддержкаtaglib:

<%@ taglib prefix="security"
  uri="http://www.springframework.org/security/tags" %>

ВыражениеhasRole теперь можно использовать на странице для отображения / скрытия HTML-элементов в зависимости от того, кто в данный момент аутентифицирован при отображении страницы:


    This text is only visible to a user
    
This text is only visible to an admin

3. Пример авторизации на уровне метода -@PreAuthorize

Выражения безопасности могут также использоваться для защиты бизнес-функций на уровне методов с помощью аннотаций.

Аннотации@PreAuthorize и@PostAuthorize (а также@PreFilter и@PostFilter) поддерживают Spring Expression Language (SpEL) и обеспечивают управление доступом на основе выражений.

Во-первых, чтобы использовать безопасность на уровне метода, нам нужно включить это в конфигурации безопасности, используя@EnableGlobalMethodSecurity:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    ...
}

Эквивалентная конфигурация XML:

Затем мы можем защитить методы с помощью аннотации Spring@PreAuthorize:

@Service
public class FooService {
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public List findAll() { ... }
    ...
}

Теперь только принципалы с ролью ADMIN смогут успешно вызвать методfindAll.

Обратите внимание, чтоthe Pre and Post annotations are evaluated and enforced via proxies - в случае использования прокси CGLIB класс и общедоступные методы не должны быть объявлены какfinal.

4. Программная проверка роли

Полномочия пользователя также можно проверить программно в необработанном Java-коде, если доступен объектrequest:

@RequestMapping
public void someControllerMethod(HttpServletRequest request) {
    request.isUserInRole("someAuthority");
}

И, конечно же, без доступа кrequest, проверку также можно выполнить вручную, просто проверив, имеет ли текущий аутентифицированный пользователь эти конкретные полномочия. The user can be obtained из контекста безопасности Spring различными способами.

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

Это руководство представляет собой быстрое введение в использование выражений безопасности Spring в целом и выраженияhasRole в частности - в качестве быстрого введения в то, как можно защитить различные части приложения.

Для примера веб-авторизации посмотритеthis Github simple tutorial. Примером безопасности на уровне метода также являетсяon GitHub.