1

LDAPレルムを使用してユーザーを認証するWebアプリケーションがあります。次に、認証されたユーザーがアプリケーションを開く権限を持っているかどうかを確認する必要があります。

私たちのアプリケーションには、多くのアプリケーション/モジュールが含まれています。すべての顧客資格情報は LDAP サーバーに保存されます。しかし、顧客はすべてのアプリケーションにアクセスできるわけではありません。彼らは購入し、アプリケーションを使用/アクセスする権利を取得します。

そこで、サーブレット API のフィルターを使用して認証を行うことを提案しました。

EJB 3.0 を使用して、サービス コンポーネントおよびその他のコンポーネントを開発しています。EJB 層の上には REST 層があり、これは誰もが Web サービスから EJB にアクセスする必要があることを意味します。EJB にアクセスする前に実行される EJB のコンポーネントはありますか、または同じ機能を提供する REST のコンポーネントはありますか?

この場合、サーブレットフィルターを使用するのは正しいですか? または、より良いアプローチはありますか?

よろしくお願いします。良い一日。

4

1 に答える 1

3

私の提案は、保護する必要があるもの、つまりビジネス ロジックの実装を保護することです。ビジネス ロジックは EJB に存在するため、最初のオプションはこの層を保護することです。

なんで?

誰かが別のチャネルを通じてビジネス ロジックを公開する日が来るでしょう。他のアプリケーションが RMI を介して EJB にアクセスする必要がある場合があります。または SOAP Web サービスとして。または何でも。セキュリティが Web 層に実装されている場合、セキュリティを実装する意思がない限り、他のアプリケーションはロジックに無制限にアクセスできます。

どのように?

いくつかのことが思い浮かびます。

  1. 最も簡単な解決策は、特定のモジュールを使用する権利を役割にマップすることです。ユーザーがそのモジュールの料金を支払うと、その役割が割り当てられます。EJB メソッドは、適切なロールのセットがアクセスできるように保護されます。サンプルコード:

    @Stateless
    public class ModuleOneBean implements ModuleOne
    {
        @Resource SessionContext ctx;
    
        public void businessMethod() {
            if( !ctx.isCallerInRole("moduleOneRole") ) {
                throw new SecurityException(...);
            }
    
            // business logic as usual
            ...
        }
    }
    
  2. 承認ロジックがそれよりも複雑な場合は、EJB インターセプターが役立つ場合があります。これらはサーブレット フィルタに似ていますが、EJB 層用です。インターセプター ベースのセキュリティ インフラストラクチャをスマートに実装すると、以前のソリューションよりも多くのケース (ロール ベースの承認のケースを含む) に対応できます。インターセプターを使用して前のケースを大まかに実装すると、次のようになります。

    @Stateless
    public class ModuleOneBean implements ModuleOne
    {
        @Interceptors(ModuleOneSecurityInterceptor.class)
        public void businessMethod() {
            // business logic as usual
            ...
        }
    }
    

    と:

    public class ModuleOneSecurityInterceptor
    {
        @Resource SessionContext ctx;
    
        @AroundInvoke
        public Object authorize(InvocationContext invctx) {
            if( !ctx.isCallerInRole("moduleOneRole") ) {
                throw new SecurityException(...);
            }
            return ctx.proceed();
        }
    }
    

    注:特にセキュリティのために、コードに負担をかけずに制御を集中化するために、インターセプターを で宣言することもできます (注釈は必要ありませ) ejb-jar.xml@Interceptors

  3. カスタム ソリューション (例:これは CDI を使用します)。


Web アプリケーションがコアにアクセスする唯一の方法であると確信している場合は、おそらくサーブレット フィルターで問題ありません。いずれにせよ、Web アプリに追加の保護レイヤーを追加する必要がある場合があります。

于 2013-11-14T13:34:33.777 に答える