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

ссылка на безопасность Spring гласит:

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

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

2 ответов


это только о конфигурации. Он говорит, что <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 может быть не в некоторых местах это поощрялось, но это был лишь пример.


для тех, кто предпочитает конфигурацию на основе аннотаций 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>