Подтвердить что ты не робот

Используя Spring Безопасность, как я могу использовать HTTP-методы (например, GET, PUT, POST) для защиты distingush для определенных шаблонов URL?

В справочной системе Spring говорится:

Вы можете использовать несколько элементов для определения разных требования к доступу для разных наборов URL-адресов, но они будут оценивается в указанном порядке и будет использоваться первое совпадение. Так что вы должен поставить наиболее конкретные совпадения вверху. Вы также можете добавить метод, чтобы ограничить соответствие конкретному HTTP-методу (GET, POST, PUT и т.д.). Если запрос соответствует нескольким шаблонам, соответствие метода будет иметь приоритет, независимо от порядка.

Как настроить Spring Безопасность, чтобы доступ к определенным шаблонам URL был защищен по-разному в зависимости от метода HTTP, используемого для доступа к шаблону URL?

4b9b3361

Ответ 1

Это только о конфигурации. В нем говорится, что элементы <intercept-url> будут оцениваться сверху вниз в теге <http /> вашего файла конфигурации:

<http auto-config="true">
    <intercept-url pattern="/**" access="isAuthenticated" />
    <intercept-url pattern="/login.jsp" access="permitAll" />
</http>

В приведенном выше примере мы пытаемся разрешить доступ только всем аутентифицированным пользователям, за исключением, конечно, страницы входа (пользователь должен сначала войти в систему, правильно?!). Но это, согласно документации, не будет работать, потому что менее конкретное соответствие находится сверху. Итак, (одна из) правильной конфигурации для достижения этой цели:

<http auto-config="true">
    <intercept-url pattern="/login.jsp" access="permitAll" />
    <intercept-url pattern="/**" access="isAuthenticated" />
</http>

Размещение более конкретного совпадения сверху.

Последнее, что говорится в цитате, касается метода HTTP. Вы можете использовать его для указания соответствия, поэтому:

<http auto-config="true">
    <intercept-url pattern="/client/edit" access="isAuthenticated" method="GET" />
    <intercept-url pattern="/client/edit" access="hasRole('EDITOR')" method="POST" />
</http>

В этом втором примере для доступа к /client/edit через GET пользователь должен пройти аутентификацию, но для доступа к /client/edit через POST (скажем, для отправки формы редактирования) пользователю необходимо иметь роль EDITOR, Этот шаблон URL может не поощряться в некоторых местах, но это был всего лишь пример.

Ответ 2

Для тех, кто предпочитает настройку на основе аннотаций Java, отбросьте этот класс в ваше приложение.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers(HttpMethod.GET).permitAll();
        http.authorizeRequests().antMatchers(HttpMethod.POST).denyAll();
        http.authorizeRequests().antMatchers(HttpMethod.DELETE,"/you/can/alsoSpecifyAPath").denyAll();
        http.authorizeRequests().antMatchers(HttpMethod.PATCH,"/path/is/Case/Insensitive").denyAll();
        http.authorizeRequests().antMatchers(HttpMethod.PUT,"/and/can/haveWildcards/*").denyAll();

    }

}

Использование следующих зависимостей Maven (более ранние версии Spring -Security также должны работать):

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>5.0.0.M3</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>5.0.0.M3</version>
    </dependency>