2011-12-08 7 views
4

現在、Java EE6セキュリティでGlassFishを使用してアプリケーションを保護する方法を研究しています。私は、領域、役割、ユーザーを作る方法を知っています。 私はサーブレットを使って素敵な基本的なログインを得ることができました。管理者のユーザーは でしたが、「正常な」ユーザーには管理ページが表示されませんでした。Java EE6 Webサービスでセキュリティを設定する

しかし、私は少し深めていきたいと思います。

アイデアは、私がEJBコンテナを使ってWebサービスをホストしていることです。 このWebサービスは発信者について何も知らないので、発信者は通話と共に資格情報(ユーザー名とパスワード)を送信しなければならないと考えました。 Webサービスはユーザーを認証し、これに基づいてメソッドへのアクセスを許可または拒否することができます。

私は2つの文字列(ユーザー名とパスワード)をチェックし、Webサービス内の呼び出し元の役割を設定する方法については手がかりがないことです。

私は、このAPIは、私を助けなければならない知っている: http://docs.oracle.com/javaee/1.4/api/javax/ejb/EJBContext.html

をしかし、それは私にこれを行う方法の明確な理解を与えるものではありません。それは私に言うことは、ユーザーがすでにロールに入っているときに特定のプロパティをチェックできるということです。 しかし、それはWebサービスなので、まだロールはありません...まず作成する必要がありますが、どうすればよいですか?

また、私はGlassFishがLDAPを介してサインオンをサポートしていることを知っています。これは私が進めている最終目標です。おそらくそれを正しく行う方法に関するアイデアですか? このすべてにアプローチするにはどうすればよいでしょうか?事前に

おかげで、

RENS

================================= ===========================

UPDATE /編集:

申し訳ありませんが、私はコメントしかできないので返信できませんでしたので、元の投稿を編集していたようです。ここで私たちは行く:

私はGlassfishのEE6 Webservicesのセキュリティを研究しなければならないということです。 ... JAAS(Java Authetication Authorization Service)についてたくさん読んでいます。

@RolesAllowed("ADMIN") 
public String doAdminStuff(){ 
    // do something 
} 

私はサーブレットでいくつかのことを試してみましたが、これは本当に素晴らしいことでした!!私はWebサービスビーンにアクセスする前にユーザーがログインできる基本認証を持っています。サーブレットweb.xmlは、どのレルムをチェックするか、どのユーザがそこにいたかといったように設定を処理しました。

サーブレットなしでテストする必要があります。なぜなら、Webサービスはクライアントであることを知らずに実行します。だから、クライアントは彼の呼び出しと一緒にユーザー名とパスワードを提供する必要があります。インターセプタを使用してログインを行い、ユーザーが@RolesALlowedアノテーションを使用してメソッドにアクセスする権限を持っているかどうかを確認しました。

これはコードです: Webサービス豆:

@LocalBean 
    @WebService 
    @Stateless 
    public class EE6SecurityBean implements EE6SecurityBeanInterface { 

    @Interceptors(UserValidationInterceptor.class) 
    @RolesAllowed("ADMIN") 
    public String doAdminStuff(String user, String password){ 
     return "it works"; 
    } 

    } 

インターセプター:私は@RolesAllowed( "ADMIN")をコメントする場合

@Interceptor 
    public class UserValidationInterceptor { 

private ProgrammaticLoginInterface programmaticLogin = new ProgrammaticLogin(); 
@AroundInvoke 
public Object intercept(InvocationContext ctx) throws Exception { 

    // for all parameters 
    List<String> list = new ArrayList<String>(); 
    for (Object p : ctx.getParameters()) { 
     list.add(p.toString()); 
    } 
    String username = list.get(0).toString(); 
    String password = list.get(1).toString(); 

    boolean loginSuccessful = programmaticLogin.login(
      username, password, "Developingjava", true); 
    if (loginSuccessful) { 

    return ctx.proceed(); 
    }else{ 
     throw new userValidationException(); 
    } 

} 
} 

は今、これはことを除いて、正常に動作します'Developingjava'領域で設定したすべてのユーザーがそのメソッドを使用できます。しかし、私は@RolesAllowedを使用している場合( "ADMIN")、私は次のエラーを取得する:

INFO:JACCポリシープロバイダ:失敗パーミッションチェック、コンテキスト(EE6SecurityEAR/EE6SecurityEJB_jar) - 許可((javax.security.jacc.EJBMethodPermission

私は自分のsun-ejb-jar.xmlをこのように構成しました(サーブレットにはXML構成が必要でしたが、Beanが偶数であることは非常に疑いがあります。 ):

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_3_0-0.dtd"> 
<sun-ejb-jar> 


    <security-role-mapping> 
     <role-name>ADMIN</role-name> 
     <group-name>Admin</group-name> 
     <principal-name>Admin</principal-name> 
    </security-role-mapping> 


     <enterprise-beans> 
     <unique-id>1</unique-id> 
     <ejb> 
      <ejb-name>EE6SecurityBean</ejb-name> 
      <jndi-name></jndi-name> 

      <pass-by-reference>false</pass-by-reference> 
      <ior-security-config> 
       <transport-config> 
        <integrity>supported</integrity> 
        <confidentiality>supported</confidentiality> 
        <establish-trust-in-target>supported</establish-trust-in-target> 
        <establish-trust-in-client>supported</establish-trust-in-client> 
       </transport-config> 
       <as-context> 
        <auth-method>username_password</auth-method> 
        <realm>Developingjava</realm> 
        <required>true</required> 
       </as-context> 
       <sas-context> 
        <caller-propagation>supported</caller-propagation> 
       </sas-context> 
      </ior-security-config> 
      <is-read-only-bean>false</is-read-only-bean> 
      <refresh-period-in-seconds>-1</refresh-period-in-seconds> 
      <gen-classes/> 

     </ejb> 
    </enterprise-beans> 
</sun-ejb-jar> 

私は本当に助けが必要です。おそらくこれはウェブサービスのセキュリティを扱う正しい方法ではないかもしれませんが、私の会社は私にEE6の新技術セキュリティに関する研究をして欲しいと思います...

アドバイスはありますか?事前に

おかげで:)私がお勧めしたい

答えて

0

最良の方法は、2ウェイのSSLを使用することです。ここで はmethod on how to setup 2-way ssl in glassfishです。 と双方向SSLを使用している場合、クライアント(サービスを呼び出す人)はjks(キーストア)とパスワードを保持する必要があります。これにより、サーバーでクライアントが識別されます。 この方法では、サーバーによって認証が行われ、何もコード化する必要はありません。

この手法は、1種類のクライアントを識別するためにのみ機能します。つまり、ユーザーからの区別はできません。管理者)。

発信者(クライアント)を個別に識別しようとしている場合は、wsse、セキュリティヘッダーを使用できます。ここでは、各ユーザーにユーザーIDとパスワードを提供できます。この情報は、各リクエストには

この方法で、異なるユーザーを識別して認証することができます。

+0

こんにちはanantha、あなたの答えをありがとう。 返信ボタンを見つけられず、コメントボタンを追加するだけなので、私はおそらく馬鹿です。私は、全部の話を準備しました。笑.. –

+0

そのアプローチの問題は、Webサービス呼び出しがそれとHTTPセッションを持っていないので、本当にそのような情報を格納することはできません(あなたの計画を誤解していない限り)。 –

+0

こんにちはAnanthaは私の非常に遅い応答に申し訳ありません。 私が持っている問題は私の仕事のためであり、私は学校で休みを取っていたので、もう私はそれに取り組んでいませんでした。 –

関連する問題