背景

Spring Securityのメソッドアノテーションでアクセス制御したいと思いました。

既存のクラスにアノテーションを付けました。

MyService.java

@Component
public class MyService {

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public void someAdminAction() {
        /* ... */
    }
}

アノテーションを有効にするためにコンフィグレーションクラスを作りました。

MethodSecurityConfiguration.java

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfiguration {

}

MyServiceはコントローラにインジェクションしていました。

MyController.java

@RestController
public class MyController {

    @Autowired
    private MyService myService;

    /* ... */
}

起きたこと

MyControllerにMyServiceをインジェクションできない!

なんかType Mismatchとかいってる!!

原因

アノテーションを付けたクラスはAOPしてプロキシになるので、型が変わっている(?)みたいです。

解決策

proxyTargetClass = trueというオプションを追加しました。

MethodSecurityConfiguration.java

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)
public class MethodSecurityConfiguration {

}