2016-06-22 6 views
1

@PreAuthorizeアノテーションをマネージドBeanと統合することを誰かが助けてくれることを願っています。私はこれを数時間働かせようとしてきましたが、明らかに欠けているものがあります。 Webに関する私の研究は、global-method-security要素がspringまたはaspectjと共に使用できることを示しています。私はマネージドBeanをSpring Beanとして宣言したくないので、私はaspectjを使うことにしました。何らかの理由で、PreAuthorizeアノテーションは完全に無視されます。私はエラーが発生せず、すべてがコンパイルされて正常に実行されますが、マネージドBeanにはセキュリティチェックはありません。どうやらアスペクトはある種の織物を必要としますか?たぶん私はこの間違った方法に近づいているし、簡単な方法があります。 JSF 2.2とSpring Security 4でTomcat 7を使用する。私はクラスの注釈を持っているが、それは私の問題かもしれない。私はクラスにそれを置くことは、デフォルトのコンストラクタメソッドを使用することを前提としています。Spring Security 4 JSFマネージドBeanの事前認証

誰かに助言してもらえますか? (下記のconfigs)

<b:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:b="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> 

<http use-expressions="true"> 
    <headers> 
     <frame-options policy="SAMEORIGIN" /> 
    </headers> 
    <intercept-url pattern="/admin/**" access="hasRole('Admin')" /> 
    <intercept-url pattern="/cms/**" access="hasAnyRole('Admin','CMS_Admin')" /> 
    <form-login login-page='/login' default-target-url="/" /> 
    <logout invalidate-session="true" logout-success-url="/" /> 
    <csrf disabled="true"/> 
</http> 

<b:bean name="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> 
<b:bean name="iberisUserDetailsService" class="com.bizznetworxonline.iberis.core.web.controllers.admin.security.IberisUserDetailsService"/> 

<authentication-manager> 
    <authentication-provider user-service-ref='iberisUserDetailsService'> 
     <password-encoder ref="bcryptEncoder"/> 
    </authentication-provider> 
</authentication-manager> 

<global-method-security mode="aspectj" pre-post-annotations="enabled" proxy-target-class="true"> 
</global-method-security> 

</b:beans> 

Mavenのは、あなたのBeanを作成し、春ではないためにJSFに指示しているとおり、豆

@ManagedBean 
@ViewScoped 
@PreAuthorize("hasAnyRole('Admin')") 
public class ProductManagement 

答えて

2

を管理

<plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.8</version> 
      <configuration> 
       <showWeaveInfo>true</showWeaveInfo> 
       <aspectLibraries> 
        <aspectLibrary> 
         <groupId>org.springframework.security</groupId> 
         <artifactId>spring-security-aspects</artifactId> 
        </aspectLibrary> 
       </aspectLibraries> 
      </configuration> 
      <executions> 
       <execution> 
        <goals> 
         <goal>compile</goal> 
        </goals> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>org.aspectj</groupId> 
        <artifactId>aspectjrt</artifactId> 
        <version>${aspectj.version}</version> 
       </dependency> 
       <dependency> 
        <groupId>org.aspectj</groupId> 
        <artifactId>aspectjtools</artifactId> 
        <version>${aspectj.version}</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

を構築

のsecurity.xml @PreAuthorizeはほとんど意味がありません。現在ログインしているユーザーは、ユーザーの役割を持っている場合

ここ
@PreAuthorize("hasRole('ROLE_USER')") 
public void create(Contact contact); 

春チェック:Beanを作成するために、春を使用した場合でも、その使用は、(あなたがそのすべての処理されたメソッドを持つようにクラスに注釈を付けることができる場合であっても)メソッドを対象としています彼が連絡先を作成できるようにするためです。

あなたの質問では、全体のビューへのアクセスが制限されているようですが、security.xml宣言の場合と同じように行ってみませんか?

<intercept-url pattern="/products/product_management.xhtml" access="hasRole('USER')" /> 

このように、春のセキュリティはWebフィルタのアクセス許可をチェックします。これはさらに優れています。

も参照してください:

+0

私はクラスレベルで宣言したとき、それはコンストラクタ呼び出しをブロックする期待していました。私は特定の方法でそれを試しても、まだ動作しません。それは大丈夫だけど、私はあなたが言ったように間違った方法でこれについて行くと思う。私はbox-of-the-box-of-urlに固執し、特定のメソッドのチェックを実行するための小さなセキュリティutilクラスを作成します。私はそれが私にもっと洗練されたコントロールを与えるだろうと思う。そうすれば、役割に基づいてデータベースに権限を入れることができます。春のセキュリティとの戦闘が少ないほど良い。 – user2677597

+0

@ user2677597問題をよりよく説明するために私の答えを少し変更しました。私が言ったように、JSF Beanで春の注釈を使用する機会はありません。あなたはSpring Beanでそれを有効にすることができます(Springのドキュメント、他のフレームワークとの統合の部分を参照してください)。このようにすれば、カスタムスコープを実装してJSFビューのスコープをエミュレートする必要がありますが、インターネットで実装されている実装はすでにあります。 –

+0

@ user2677597解決しましたか?マネージドBeanメソッドでアノテーションレベルを取得するにはどうしましたか? –

関連する問題