【问题标题】:Why does @Resource not work with @PreAuthorize为什么@Resource 不能与@PreAuthorize 一起使用
【发布时间】:2016-08-29 21:29:43
【问题描述】:

我有一个关于 Spring 机制的问题。这是场景:

我有一个抽象的 Controller 类,它有一些由 @Resource 注解注入的依赖项。子类包含用于处理请求的@RequestMapping 注释。到目前为止,一切正常,所有依赖项都被注入了。

现在我正在尝试将 Spring Security 引入我们的项目,但是当我尝试使用 @PreAuthorize 时,我在一些 @ModelAttribute 方法中得到了 NullPointerException,因为依赖注入现在失败了。我发现,Spring 为我的 Controller 创建了一个代理类,但不知何故并没有注入所有依赖项。

也许我缺少一个配置来告诉 Spring 代理必须使用目标的依赖项,或者它应该将所有依赖项注入代理本身。

如果有人有想法,我很乐意听到。

【问题讨论】:

    标签: java spring spring-mvc dependency-injection


    【解决方案1】:

    如果你想使用预授权注释,那么最好的部分是在服务层而不是控制器中使用它们。 这也记录在这里http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/faq.html#faq-method-security-in-web-context “一般来说,我们建议在服务层而不是在单个 Web 控制器上应用方法安全性”

    如果您想保护 url(即在控制器中定义的请求映射),最好的方法是使用该 url 中描述的拦截 url 模式 http://docs.spring.io/spring-security/site/docs/4.0.x/reference/html/core-web-filters.html#filter-security-interceptor

    如果您仍想在控制器中使用预授权,那么 你可以按照这些说明(这里已经存在Securing controller method with @RolesAllowed and @PreAuthorize

    要使用 PreAuthorize 和 JSR-250 注释,您必须

    • 注释你的弹簧安全配置类: @EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true)
    • 如果您在应用程序中的其他任何地方使用带有 JDK 代理的 Spring AOP,请让所有要在其中使用方法安全性的控制器类实现声明所有受保护方法的接口
    • 如果您在应用程序 Spring AOP 中的其他任何地方使用 CGLIB 代理,请将 proxyTargetClass = true 添加到 @EnableGlobalMethodSecurity : @EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true, proxyTargetClass = true)
    • 如果您想在 Spring 3.2 以下版本中使用 CGLIB 代理,请将 CGLIB 库添加到您的类路径中(CGLIB 类包含在 Spring 3.2+ 中) 避免混合 CGLIB 和 JDK 代理,因为 Spring 文档不建议这样做:多个部分在运行时折叠成一个统一的自动代理创建器,它应用任何部分的最强代理设置(通常来自不同的 XML bean 定义文件)指定的。这也适用于 and 元素。需要明确的是:使用 'proxy-target-class="true"' on 或元素将强制对所有三个元素使用 CGLIB 代理。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2016-02-05
      • 2018-03-09
      • 2021-06-14
      • 2012-10-09
      • 2020-03-18
      • 2017-11-21
      • 2019-04-11
      • 2012-09-19
      • 2013-12-30
      相关资源
      最近更新 更多