Используя Spring Безопасность, как я могу использовать HTTP-методы (например, GET, PUT, POST) для защиты distingush для определенных шаблонов URL?
В справочной системе Spring говорится:
Вы можете использовать несколько элементов для определения разных требования к доступу для разных наборов URL-адресов, но они будут оценивается в указанном порядке и будет использоваться первое совпадение. Так что вы должен поставить наиболее конкретные совпадения вверху. Вы также можете добавить метод, чтобы ограничить соответствие конкретному HTTP-методу (GET, POST, PUT и т.д.). Если запрос соответствует нескольким шаблонам, соответствие метода будет иметь приоритет, независимо от порядка.
Как настроить Spring Безопасность, чтобы доступ к определенным шаблонам URL был защищен по-разному в зависимости от метода HTTP, используемого для доступа к шаблону URL?
Ответы
Ответ 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>