【发布时间】:2014-11-27 09:40:42
【问题描述】:
我有一个使用 SpringMVC 4 开发的 RESTful 应用程序。通常我在服务层使用安全注释,它运行良好。现在我遇到了以下(常见)情况:REST 控制器接收到一个需要验证的 JSON,但由于安全性位于服务层上,因此验证是在在安全控制之前执行的。这意味着未经授权的用户在拒绝访问错误之前收到所有验证错误。
我试图在控制器方法上移动@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);
}
}
【问题讨论】:
-
尽量保持分开。通常,您通过 HTTP 安全性保护 URI 路径。如果验证涉及业务逻辑,则在服务层实现逻辑。
-
如果我将 @Secured("IS_AUTHENTICATED_FULLY") 注释移动到控制器的方法中,它将被忽略。我不明白,但应用于控制器方法的安全注释并不总是有效。这就是我将所有安全性转移到业务逻辑层的主要原因。
-
Spring 的 AOP 适用于接口(除非您使用
aspectj)。这就是为什么它不能在控制器上工作的原因,除非你有他们的方法的接口——这将是相当大的杀伤力。您应该使用 HTTP 安全性来保护控制器 - docs.spring.io/autorepo/docs/spring-security/4.0.0.CI-SNAPSHOT/…。 -
@PavelHoral 如果启用它,它也会很高兴地在课程上工作。
标签: validation spring-mvc spring-security