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

Ссылка на Spring Security:

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

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

Ответы [ 2 ]

26 голосов
/ 09 сентября 2011

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

13 голосов
/ 30 августа 2017

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