Как я могу разрешить запросы 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
   }

}
Другие вопросы по тегам