0

イントラネット用の Web アプリケーションを構築しています。そして、システム(PC /ラップトップ)のユーザー名に基づいてユーザーを認証する、つまりシングルサインオンを実装する必要がありました。今日まで、基本的にシステムのユーザー名を選択し、ユーザー名を要求せずにログインするログイン ページをテストするたびに、とても満足していました。それが私が必要としていたものです。ただし、今日、イントラネットの別のシステムからアプリケーションをテストするために、ログインページを開いたときに、自分のユーザー名がまだ取得されていました。ここで物事をより明確にするために、例があります。私のシステムの名前がUser1の場合、このログインページはUser1を取得してデータベースで認証し、ホームページに移動します。ただし、ユーザー名 User2 を持つ別のシステムからログイン ページをテストしたとき。ログインページはまだ自分のシステムユーザー名を取得しています

誰かが私の間違いや私が含めなかったものに光を当てることができますか. ユーザー名 = System.getProperty("user.name"); ログインページにアクセスするさまざまなシステムからユーザー名を選択する正しい方法はありますか?

構成に関する詳細:

  1. Glassfish V3.1.2
  2. JSF2.0 (ログイン ページを含む XHTML のすべてのページ)
  3. JPA Eclipselink
  4. SQLServer2008 R2

これが私のコントローラークラスのコードスニペットです

public boolean validateUser(String username) {

        String sysName = System.getProperty("user.name");
        System.out.println("System User is: " + sysName);

        if (username.equalsIgnoreCase(sysName)) {
            String checkUser = (String) entityManager
                    .createQuery(
                            "select u.username from User u where u.username =:username")
                    .setParameter("username", username).getSingleResult();
            System.out.println("User found in database: " + checkUser);
            if (checkUser.equalsIgnoreCase(username)) {
                System.out.println("Loggin sucessful!");
                return true;
            } else {
                System.out
                        .println("User does not exists in the system. Thus second failed");
                return false;
            }
        } else {
            System.out
                    .println("User not logged in from own system thus first failed");
            return false;
        }

    }

私の ManagedBean クラスのコード スニペット

public String username = System.getProperty("user.name");

//  private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String login() {
        FacesContext context = FacesContext.getCurrentInstance();

        if (uDB.validateUser(username)) {
            userId = uDB.findUser(username);

            context.getExternalContext().getSessionMap().put("userId", userId);
            if (uGDB.validateGroup(userId)) {
                return "home.jsf?faces-redirect=true&includeViewParams=true";
            }
            return "normalHome.jsf?faces-redirect=true&includeViewParams=true";

        } else {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            message.setSummary("Username doesn't exists! OR User is trying to login from someone else's account");
            context.addMessage("", message);
            return null;
        }
    }

わかりましたので、現在の調査結果と少し前に実装したことで質問を拡張することを考えました。以下は、システムからユーザー名を取得するために作成した SSOApplet.class です。

SSOApplet.class

import java.applet.Applet;

public class SSOApplet extends Applet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    String sysUser = null;

    public String getSystemUsername() {
        try {
            sysUser = System.getProperty("user.name");
            return sysUser;
        } catch (Exception e) {
            System.out.println(e);
            return null;
        }

    }
}

そして、本文内の XHTML ページにプラグインしました

<object>
        <param name="myApplet" value="SSOApplet.class" />
    </object>

この文字列値をアプレットからloginBeanに渡す方法を検索しようとしています。私は次のステップについてまったく無知です。答えをグーグルで検索しようとしましたが、それから理解できたのは、今すぐJavaScriptを書かなければならないということだけですか? アプレットが取得したユーザー名の値を設定するため。誰かが私に正しい次のステップを教えてもらえますか? ユーザーに入力を求めることなく、システムのユーザー名を loginBean に渡すにはどうすればよいですか?

4

1 に答える 1

4

Java/JSF コードは Web ブラウザーで実行されません。Web サーバーが実行されているマシンと物理的に同じマシンで実行されます。Webブラウザが実行されるマシンでは実行されません。プロセスは次のとおりです。

  1. クライアント (Web ブラウザーを持つユーザー) は、HTML ページを要求する HTTP 要求を送信します。
  2. サーバー (Web サーバー) は HTTP 要求を取得し、すべての Java コードを実行します。
  3. Java/JSF コードは HTML 出力を生成します。
  4. サーバーは、HTML ページを表す HTTP 応答として HTML 出力をクライアントに送り返します。
  5. クライアントは HTML ページを取得して表示します。

あなたの間違いは、Java/JSF コードがクライアント側で実行されることをどういうわけか期待していたことです。これはかなり大きな誤解です。

基本的に、クライアント側で Java コードを実行するには、Java アプレットまたはJava Web Start<object>を作成し、要素を介して HTML 出力に埋め込む必要があります。このようにして、クライアントは Java プログラムをダウンロードし、ローカルで実行します (したがって、Web ブラウザが実行されているのと物理的に同じマシンで)。その環境は通常サンドボックス化されていることに注意してください。システム情報の取得など、より多くの権限を得るために署名が必要になる場合があります。

ただし、具体的な機能要件については、まったく異なるソリューションを探す必要があります。シングル サインオン (SSO) や LDAP などのメカニズムに注目してください。詳細については、サーバー管理者にお問い合わせください。

于 2013-04-12T18:26:55.307 に答える