2011-07-28 20 views
2

私はAOPの知識が必要な設定に苦労しています。Spring AOPとapache shiroの設定。注釈がスキャンされていません

私はAOPが私が成功することなくしばらくの間得ようとしている部分であることを認めなければなりません。 私のshiro注釈はスキャンされないので無視されるようです。

私はshiro 1.1.0+ maven3 + spring 3.0.5.RELEASE、ZK 5.0.6でHibernate 3.6.1.Finalを使用しようとしました。 私はhibernaterealmをデータベースに接続して作業しています。認証が正常に動作しています。

ので、許可側をテストするために、私はどこかに私のコードでは、この持っている:

Subject currentUser = SecurityUtils.getSubject(); 
    if (!currentUser.isPermitted("businessaccount:list")) { 
    throw new AuthorizationException("User not authorized"); 
    } 

をし、それが正常に動作します。
私はZK GenericForwardControllerを拡張しているコントローラクラスで最初にインターフェイスを使用する計画はなかったので、私のアクセス許可がロードされていることを知っています。 。

私はこれを見てきましたが、私はメソッドの@RequiresPersmissionsを使って1つのインターフェースでtryをしようと決めました。

@Component("layouteventhandler") 
public class LayoutEventHandlerImpl extends GenericForwardComposer implements  LayoutEventHandler { 

Logger logger = Logger.getLogger(LayoutEventHandlerImpl.class); 
Menuitem logout; 

//... 


@Override 
public void onClick$pAccounts() { 
    try { 
     execution.sendRedirect("/accounts/personal/list"); 
    } catch (Exception ex) { 
     logger.info("Error redirecting to personal accounts", ex); 
    } 
} 


@Override 
public void onClick$bAccounts() { 
    try { 
     execution.sendRedirect("/accounts/business/list"); 
    } catch (Exception ex) { 
     logger.info("Error redirecting to business accounts", ex); 
    } 
} 
//..... 
} 

そのインターフェイス、それを:ここでのコードの抜粋です私は何か間違ったことをやっている私のlog.Maybeにはエラーではありません、それは不正subject.thereへのアクセス権を与えているのように

は明らかにそれはまだ働いていません:ここ

public interface LayoutEventHandler { 

@RequiresPermissions(value="personalaccount:list") 
public void onClick$pAccounts(); 

@RequiresPermissions(value="businessaccount:list") 
public void onClick$bAccounts(); 
//..... 

} 

は私史郎のApplicationContextのある

<bean id="hibernateRealm" class="com.personal.project.admin.webapp.security.DatabaseRealm" /> 
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> 
    <property name="realm" ref="hibernateRealm" /> 
</bean> 

<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /> 

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" 
     depends-on="lifecycleBeanPostProcessor"> 
<!--   <property name="proxyTargetClass" value="true" />--> 
</bean> 
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> 
    <property name="securityManager" ref="securityManager"/> 
</bean> 

<!-- Secure Spring remoting: Ensure any Spring Remoting method invocations can be associated 
    with a Subject for security checks. --> 
<bean id="secureRemoteInvocationExecutor" class="org.apache.shiro.spring.remoting.SecureRemoteInvocationExecutor"> 
    <property name="securityManager" ref="securityManager"/> 
</bean> 
<!-- ... --> 

私は何をすべきか?読んでお手伝いしてくれてありがとう

+0

詳細情報を提供できますか?あなたのShiro注釈はどのように無視されますか?あなたのクラスでは、それらが配線されているのはヌルですか? – Caps

+0

こんにちは私があなたの要望どおりに詳細を追加しました。ありがとう –

+0

これはまだ興味がありますか?あなたは他のAOPの使い方を持っていますか? – rudolfson

答えて

2

私はShiroを知らないけど、インタフェースを実装しているBeanクラスに注釈をつけて、セキュリティ、トランザクション、または他の何か。その場合、返されるオブジェクトはJDKの動的プロキシです。これはBeanの具象クラスのインスタンスではなく、実装するインタフェースのみです。したがって、具体的なクラスの注釈に依存する注釈のスキャンでは、それを見つけることはできません。ライアン・スチュワートの答えに拡大すること

0

、あなたが実装するクラス(ないインターフェイス)に

@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) 

を追加し、それに史郎注釈を移動する必要があります。

0

2つのスプリングコンテキストを実行しているときに同様の問題が発生しました。データベース、サービス、セキュリティ、および非SpringMVC Web Beanを定義した親ルートコンテキストと、プロキシを要求するコントローラを含むSpring MVC REST APIの子Webコンテキストがあります。各コンテキストのコンフィグレーションは、別々のパッケージをスキャンするクラスパスでした。

この場合、DefaultAdvisorAutoProxyCreatorおよびRequiedAttributeSourceAdvisor Beanが要求されていることを確認してください。ここでRest Controllersはクラスパススキャンされています)、親コンテキストでそれらを定義しても機能しません(DefaultAdvisorAutoProxyCreateのドキュメントは、これについては後で詳しく説明しています)。

誰かが同じ問題に遭遇した場合に備えて、これを投稿してください。

関連する問題