0

GWTアプリケーションとSpringSecurityの統合を実行しようとしています。@PreAuthorize("hasRole('ROLE_USER')")また、DAOクラスのメソッドにアノテーションを追加すると、次の例外が表示されます。

タイプ[server.dao.ElementServiceDAO]の一意のBeanが定義されていません:単一のBeanが必要ですが、0が見つかりました

DaoServiceLocatorはDAOBeanを見つけることができませんが、デバッグモードでは、ApplicationContextインスタンスにelementServiceDAOBeanが表示されます。

私のDAOクラスは次のようになります。

@Service
public class ElementServiceDAO extends EntityDAO {

@PreAuthorize("hasRole('ROLE_USER')")
@SuppressWarnings("unchecked")
public Layer getFullRenderingTopology() {
...
}

}

DAOサービスロケーターのコード:

public class DaoServiceLocator implements ServiceLocator {

@Override
public Object getInstance(final Class<?> clazz) {
    try {
        final HttpServletRequest request = RequestFactoryServlet
                .getThreadLocalRequest();

        final ServletContext servletContext = request.getSession()
                .getServletContext();

        final ApplicationContext context = WebApplicationContextUtils
                .getWebApplicationContext(servletContext);

        return context.getBean(clazz);
    } catch (final Exception e) {
        throw new RuntimeException(e);
    }
}
}

applicationContext-security.xml:

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="operator" password="operator" authorities="ROLE_USER, ROLE_ADMIN" />
            <user name="guest" password="guest" authorities="ROLE_USER" />
        </user-service>
    </authentication-provider>
</authentication-manager>

<global-method-security pre-post-annotations="enabled" /> 

アドバイスをお願いします!

4

1 に答える 1

1

インターフェイスを実装する場合(このElementServiceDAO場合、推移的に経由EntityDAO)、Springはデフォルトで、セキュリティの側面を適用するためのインターフェイスベースのプロキシを作成します。したがって、elementServiceDAOアプリケーションコンテキストでは、のインスタンスではないプロキシであるElementServiceDAOため、タイプごとに取得することはできません。

あなたはどちらかをする必要があります

  • 次のように、ターゲットクラスベースのプロキシの作成を強制します

    <global-method-security 
        pre-post-annotations="enabled" proxy-target-class = "true" /> 
    
  • ElementServiceDAOまたは、実装クラスの代わりにそのインターフェイスのビジネスインターフェイスを作成して使用します。

参照:

于 2012-04-09T10:06:40.700 に答える