У меня есть приложение RESTful, разработанное с помощью SpringMVC 4. Обычно я использую аннотации безопасности на уровне сервиса, и он работает хорошо. Теперь у меня есть следующая (общая) ситуация: контроллер REST получает JSON, который должен быть проверен, но поскольку безопасность находится на уровне сервиса, проверка выполняется до контроль безопасности. Это означает, что неаризованный пользователь получает все ошибки проверки до ошибки отказа в доступе.SpringSecurity, аннотации безопасности и проверка MVC
Я попытался перенести аннотацию @Secured на метод контроллера, но, как ни странно, она не всегда работает.
Идеальным решением было бы перемещение проверки на сервисном уровне, но это не представляется возможным.
Какое оптимальное решение в этих случаях?
@Service
public class MyServiceImpl {
@Secured("IS_AUTHENTICATED_FULLY")
public ResponseDto serviceMethod(RequestDto richiesta) {
//Do some stuff
}
}
@RestController
@RequestMapping("/api/v1/blabla")
public class BlablaController {
@Autowired
MyService myService;
@RequestMapping(method=RequestMethod.POST)
@ResponseBody MyResponseDto blablaMethod(@RequestBody @Valid RequestDto req) {
return myService.serviceMethod(req);
}
}
Старайтесь держать вещи раздельными. Обычно вы защищаете маршруты URI через HTTP-безопасность. Если в валидации есть бизнес-логика, реализуйте логику на уровне сервиса. –
Если я перемещаю аннотацию @Secured («IS_AUTHENTICATED_FULLY») на метод контроллера, она игнорируется. Я не понял, но аннотации безопасности, применяемые к методам контроллера, не всегда работают. это основная причина, по которой я переместил всю безопасность на уровень бизнес-логики. – Marco
Spring AOP работает на интерфейсах (если вы не используете 'aspectj'). Вот почему он не может работать на контроллерах, если только у вас нет интерфейсов для их методов - и это будет довольно перебор. Вы должны использовать защиту HTTP для защиты контроллеров - http://docs.spring.io/autorepo/docs/spring-security/4.0.0.CI-SNAPSHOT/reference/htmlsingle/#jc-httpsecurity. –