メソッドセキュリティアノテーションを適用しない

annotations java spring-security

Springが私のサービスインターフェースに@Secured( “ROLE_USER”)を強制していないのはなぜなのかというと失われたこともあります。 私のコントローラーはアノテーションを使って設定されています。

私のサービスインターフェースの例

パブリックインタフェースMyServiceManager {

@Secured( "ROLE_USER")public void delete(int cid);

@RolesAllowed({"ROLE_USER"})public連絡先getContact(int contactId); }

私のセキュリティコンテキスト

  15  3


ベストアンサー

あなたは声明を持っていますか

MyServiceManager Beanを定義したのと同じ構成ファイルにありますか。 org.springframeworkのデバッグをオンにするまで同じ問題を抱えていましたが、Springセキュリティはglobal-method-securityが定義されているファイルと同じファイルにのみ適用されることに気付きました。

7


私の場合、この文の正確な位置は次のとおりです。

非常に重要であることが証明されました。 どのクラスをスキャンしてコントローラとして使用するかを宣言した後に、必ずそれを配置してください。

これは、@ Securedアノテーションも確実にゲームに取り込まれるようにする方法です。

4


この問題についてさらに研究を重ねた結果、私は次のような結論に達しました。 100%正しいかどうかはわかりませんが、機能します。

私は自分の設定をすべてdispatcher-servlet.xmlファイルに入れました。 そのため、disptacher-servlet.xmlとapplication-context.xmlを持つ代わりに。 dispatcher-servlet.xmlはアプリケーション(contextConfigLocation)によってロードされます。 dispatcher-servlet.xml内に、security-context.xmlとdatasource-context.xmlをインポートします。 それで、すべてがうまくいきます。

2


私はこれと同じ問題を抱えていました。 ここでのKent Laiの返信からの情報を使用して、私はそれを修正することができました。

私は ++`要素を `+ app-servlet.xml +`に配置しましたが、セキュリティ定義は `+ security.xml +`に分けておきました。 .xml + `および + security.xml + `。

今魅力のように動作します!

2


インターフェースではなく実装クラスにアノテーションを付けてみて、それが機能するかどうかを確認してください。 サービスレイヤで@Transactional属性も使用していたため、最近のプロジェクトでこれを実行しました。Springのドキュメントでは、インターフェイスではなくクラスにそれらを配置することを推奨しています。 同じ問題が@Securedにも当てはまるかどうかわかりませんが、アノテーションを同じ場所に保存したいと思いました。 Spring Docsを参照してください。

Kent Laiの答えについて…それは良い考えです…あなたのセキュリティ設定ファイルが実際にSpringによってインクルードされていることを確認してください。

1


あなたのweb.xmlでこのようなものを使用しましたか

name org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/webmvc-config.xml 1

理由はわかりませんが、DispatcherServletを使用した場合、セキュリティアノテーションを適用できませんでした

1


私はこれと同じ問題を抱えていました。 追加した後:

私のspring-security.xmlファイルでそれは消えた。

これが誰かに役立つことを願っています:)

0


タイトルとURLをコピーしました