Как я могу разрешить запросы GET без аутентификации, но защитить другие методы HTTP?
Я создал веб-сервис с Spring Roo и добавил Spring Security в проект. Пока все работает нормально, но теперь я хочу разрешить доступ к информации об объектах через запросы HTTP GET без какой-либо аутентификации. Другие методы HTTP, такие как POST, PUT и т. Д., Должны оставаться безопасными.
Мой applicationContext-security.xml выглядит следующим образом, но когда я выполняю HTTP GET для "/releaseupdates/" с заголовком "Accept: application/json", он всегда возвращает страницу входа (я думаю, что Spring Security перенаправляет на страницу входа внутри):
<http auto-config="true" use-expressions="true">
<form-login login-processing-url="/resources/j_spring_security_check" login-page="/login" authentication-failure-url="/login?login_error=t" />
<logout logout-url="/resources/j_spring_security_logout" />
<!-- Configure these elements to secure URIs in your application -->
<intercept-url pattern="/releaseupdates/**" access="permitAll" method="GET" />
<intercept-url pattern="/releaseupdates/**" access="hasRole('ROLE_ADMIN')" method="POST" />
<intercept-url pattern="/releaseupdatestatuses/**" access="hasRole('ROLE_ADMIN')"/>
<intercept-url pattern="/choices/**" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/member/**" access="isAuthenticated()" />
<intercept-url pattern="/resources/**" access="permitAll" />
<intercept-url pattern="/login/**" access="permitAll" />
<intercept-url pattern="/**" access="isAuthenticated()" />
</http>
1 ответ
Существует также аннотация @PreAuthorize, которая может быть вашим другом здесь. Аннотация может быть на уровне класса или метода на ваших контроллерах.
Вот пример:
@Controller
@RequestMapping("/releaseupdates")
public class ReleaseUpdateController {
@RequestMapping(method=RequestMethod.GET)
public String unprotectedGetRequest() {
//do something, no protection
}
@PreAuthorize("hasRole('ROLE_ADMIN')")
@RequestMapping(method=RequestMethod.POST)
public String securePostRequest() {
//do something, secured
}
}