私たちのプロジェクトでは、xml と注釈ベースの spring mvc セキュリティ構成を混在させています。かなりの数の役割、多数の管理者がおり、誰が何を実行できるかについて頻繁に変更される要件があります。このようなパーミッション マトリックスを生成する util クラスがあればいいと思いました。
これまでに行ったことは、 @Controllerでマークされたすべてのクラスを検索し、 @PreAuthorize の値を抽出する単純なクラスパス スキャナーを作成することです。コントローラーの命名規則は単純です。{Action}{Type}Controller (例: NewOrderController) であるため、人間が (プログラマーでなくても) 読み取り可能な csv ファイルを簡単に生成できます。
問題は、注釈のクラスパス スキャンが、xml 構成で取得したものをカバーしていないことです。
spring mvc 自体によるアクセス解決に使用されるメタデータを照会する他の方法があるかどうか疑問に思っていました。
編集:
xml 構成の例 (大幅に簡略化):
<security:http pattern="/static/**" security="none" />
<security:http auto-config="false"
use-expressions="true"
entry-point-ref="entryPoint"
security-context-repository-ref="securityContextRepository">
<security:intercept-url pattern="/product/**" access="hasAnyRole('PRODUCT_USER')" />
<security:intercept-url pattern="/admin/**" access="hasAnyRole('ADMIN_USER')" />
<!-- No security configuration for /order/** -->
</security:http>
アノテーション駆動構成の例:
@Controller
@RequestMapping("/order/new/{id}")
public class NewOrderController {
@Autowired
public NewOrderController() {
}
@RequestMapping(method = RequestMethod.GET)
@PreAuthorize("hasRole('ORDER_USER')")
public ModelAndView display() {
return new ModelAndView(/*...*/);
}
@RequestMapping(method = RequestMethod.POST)
@PreAuthorize("hasRole('ORDER_USER')")
public RedirectView process() {
return new RedirectView(/*...*/);
}
}