2012-02-07 4 views
3

メソッドセキュリティを使用しようとしているので、dispatcher-servlet.xml(security.xmlは別のコンテキストにあります):Controllerで@RolesAllowedを使用し、「オブジェクトがクラスを宣言するインスタンスではありません」

<security:global-method-security secured-annotations="enabled" jsr250-annotations="enabled" /> 

とコントローラ上で@RolesAllowedを置く:

@SessionAttributes({"sessionCompanyDetails"}) 
@Controller 
@RequestMapping("/company") 
@RolesAllowed("ROLE_ADMIN") 
public class CompanyController extends BaseController { 
    ... 

は、私はこれらのアノテーションを使用するときに春がコントローラにプロキシを作成し、そのため、私はエラーを取得することを実現0

+0

完全なスタックトレースを投稿してください。 – Ralph

答えて

2

コントローラにインターフェイスがないため、Springがプロキシを作成してもコントローラクラスにキャストできないため、この問題が発生します。

可能な解決策は以下のとおりです。

  1. インターセプタ:春は、それを唱えることができますので、(プロキシクラスをサブクラスである)CGLIBプロキシを有効<global-method-security proxy-target-class="true"/>を使用MethodSecurityInterceptorとAccessDecisionManager
  2. を使用します。
  3. コントローラへのインターフェイスを作成します。
  4. ApectJを使用する。

私はApectJ以外のすべてのソリューションをテストしました。私はCGLibソリューションを1つのプロジェクトに使用しています。もう1つはInterceptorを使用していますが、両方のソリューションが正常に動作します。

0

詳細をお知らせください。

  1. 特定のコード行番号(原因)で例外がスローされましたか?
  2. JSR250-Annotations(@RolesAllowed)またはSpring-Way-Annotations(@Secured)を使用しますか?
+1

JSR250とSpring-Way-Annotationの両方がプロキシを作成するので、それらはすべて破損します。これは、AspectJやController用のインターフェースを使用していないため、SpringがそのコントローラーにProxyをキャストできないためです。私はInterpectorを試してプロキシを削除していました。 – Bruno

+1

はい。プロキシクラスを使用するか、インターフェイスを使用してください。 ;) – knalli

関連する問題