2014-11-27 2 views
2

У меня есть приложение 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); 
    } 
} 
+0

Старайтесь держать вещи раздельными. Обычно вы защищаете маршруты URI через HTTP-безопасность. Если в валидации есть бизнес-логика, реализуйте логику на уровне сервиса. –

+0

Если я перемещаю аннотацию @Secured («IS_AUTHENTICATED_FULLY») на метод контроллера, она игнорируется. Я не понял, но аннотации безопасности, применяемые к методам контроллера, не всегда работают. это основная причина, по которой я переместил всю безопасность на уровень бизнес-логики. – Marco

+0

Spring AOP работает на интерфейсах (если вы не используете 'aspectj'). Вот почему он не может работать на контроллерах, если только у вас нет интерфейсов для их методов - и это будет довольно перебор. Вы должны использовать защиту HTTP для защиты контроллеров - http://docs.spring.io/autorepo/docs/spring-security/4.0.0.CI-SNAPSHOT/reference/htmlsingle/#jc-httpsecurity. –

ответ

0

Я отвечаю на свой вопрос.

Решение заключалось в том, чтобы разрешить проверку на уровне сервиса и проверить компонент, когда вызывается метод службы.

В моей applicationContext.xml:

<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/> 

И интерфейс MYSERVICE:

@Validated 
public interface MyService { 
    ResponseDto serviceMethod(@Valid RequestDto richiesta); 
} 

Надеется, что это помогает кто-то другое.

Смежные вопросы