gpt4 book ai didi

java - @Secured 注释在使用 Autoproxy 的 AspectJ 模式下不起作用

转载 作者:行者123 更新时间:2023-11-29 10:18:31 24 4
gpt4 key购买 nike

我正在尝试让我的 Spring MVC 应用程序与 Spring @Secured 注释和 AspectJ 自动代理配合得很好,但它似乎没有代理或识别我的 @Secured 注释。我有一个这样的 Controller :

@Controller
@RequestMapping("/")
public class ApplicationController {

private ApplicationFactory applicationFactory;

@Inject
public ApplicationController(ApplicationFactory applicationFactory) {
super();
this.applicationFactory = applicationFactory;
}

@Secured("ROLE_USER")
@ResponseBody
@RequestMapping(method = GET)
public Application getApplicationInfo() {
return applicationFactory.buildApplication(this);
}

}

还有一个看起来像这样的 spring security XML:

代码:

  <security:global-method-security secured-annotations="enabled" mode="aspectj" proxy-target-class="true" />

<security:http auto-config="true" use-expressions="true">
<security:http-basic/>
</security:http>

上面的内容由一个非 xml 的 Spring @Configuration 组件加载,如下所示:

@Configuration
@ComponentScan(basePackages = {"com.example"})
@EnableWebMvc
@ImportResource("classpath:security.xml")
public class ApplicationConfiguration extends WebMvcConfigurerAdapter {

}

依次使用 Servlet 3.0 WebApplicationInitializer 加载:

public class SpringMvcInitializer implements WebApplicationInitializer {

private final AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();

public void onStartup(ServletContext servletContext) throws ServletException {
context.register(ApplicationConfiguration.class);

servletContext.addListener(new ContextLoaderListener(context));
servletContext.addListener(new Log4jConfigListener());

final DelegatingFilterProxy proxy = new DelegatingFilterProxy("springSecurityFilterChain", context);
FilterRegistration.Dynamic filter = servletContext.addFilter("securityFilter", proxy);
filter.addMappingForUrlPatterns(EnumSet.of(REQUEST), false, "/*");

final DispatcherServlet servlet = new DispatcherServlet(context);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", servlet);
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
}

}

但是,Spring Security 没有检测到注释,我仍然可以在未经授权的情况下使用上面的安全端点。根据Spring Security FAQ ,这可能是因为 <global-method-security>元素被加载到错误的应用程序上下文中,但我不知道如何使用上述无 xml Spring 配置来确保这一点。

我错过了什么吗?我尝试将 @EnableAspectJAutoProxy(proxyTargetClass = true) 添加到我的应用程序配置中,但这也没有帮助。是否有运行时织入或我必须使用编译时织入来为我的应用程序启用基于注释的安全性?

最佳答案

在 Spring 中使用 AOP 时,您可以在两种 AOP 实现之间进行选择:

  • Spring AOP 实现不需要编织,但它只适用于Spring 管理的bean,并且有some limitations

  • AspectJ AOP 实现适用于所有对象,没有 Spring AOP 的限制,但需要编译时或加载时织入

mode="aspectj" 告诉 Spring 使用 AspectJ 进行 AOP 实现,因此在您的案例中如果没有编织,安全方面将无法工作。

术语“AspectJ 自动代理”与使用 AspectJ 作为 AOP 实现无关——它是一个允许您将 AspectJ API(而不是实现)与 Spring AOP 一起使用的特性。

因此,在您的情况下,您可以使用 Spring AOP 实现,因为 Controller 是一个 Spring bean,因此您应该删除 mode="aspectj"。另请注意,您的 Controller 应该具有无参数构造函数 - 这是 Spring AOP 的限制之一。

关于java - @Secured 注释在使用 Autoproxy 的 AspectJ 模式下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11400503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com