【问题标题】:SpringSecurity, security annotations and MVC validationSpringSecurity、安全注解和 MVC 验证
【发布时间】: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


【解决方案1】:

我回答我自己的问题。

解决方案是在服务层启用验证,并在调用服务方法时验证 bean。

在我的 applicationContext.xml 中:

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

在 MyService 接口中:

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

希望这对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2014-07-11
    • 2011-04-08
    • 2011-06-13
    • 1970-01-01
    • 2011-12-21
    • 2014-09-24
    • 2012-06-16
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多