SpringMVCアプリをSpring@SecuredアノテーションとAspectJ自動プロキシでうまく動作させようとしていますが、@Securedアノテーションをプロキシまたは認識していないようです。私はこのようなコントローラーを持っています:
@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);
}
}
そして、次のような春のセキュリティ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>
上記は、次のようなno-xmlSpring@Configurationコンポーネントによってロードされています。
@Configuration
@ComponentScan(basePackages = {"com.example"})
@EnableWebMvc
@ImportResource("classpath:security.xml")
public class ApplicationConfiguration extends WebMvcConfigurerAdapter {
}
これは、サーブレット3.0WebApplicationInitializerを使用してロードされます。
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>
要素が間違ったアプリケーションコンテキストにロードされているためですが、上記のno-xmlSpring構成を使用してこれを確認する方法がわかりません。
私は何かが足りないのですか?@EnableAspectJAutoProxy(proxyTargetClass = true)をアプリケーション構成に追加しようとしましたが、それも役に立ちませんでした。とにかくランタイムウィービングを行う必要がありますか、それともアプリケーションのアノテーションベースのセキュリティを有効にするためにコンパイルタイムウィービングを使用する必要がありますか?