イントラネット用の Web アプリケーションを構築しています。そして、システム(PC /ラップトップ)のユーザー名に基づいてユーザーを認証する、つまりシングルサインオンを実装する必要がありました。今日まで、基本的にシステムのユーザー名を選択し、ユーザー名を要求せずにログインするログイン ページをテストするたびに、とても満足していました。それが私が必要としていたものです。ただし、今日、イントラネットの別のシステムからアプリケーションをテストするために、ログインページを開いたときに、自分のユーザー名がまだ取得されていました。ここで物事をより明確にするために、例があります。私のシステムの名前がUser1の場合、このログインページはUser1を取得してデータベースで認証し、ホームページに移動します。ただし、ユーザー名 User2 を持つ別のシステムからログイン ページをテストしたとき。ログインページはまだ自分のシステムユーザー名を取得しています
誰かが私の間違いや私が含めなかったものに光を当てることができますか. ユーザー名 = System.getProperty("user.name"); ログインページにアクセスするさまざまなシステムからユーザー名を選択する正しい方法はありますか?
構成に関する詳細:
- Glassfish V3.1.2
- JSF2.0 (ログイン ページを含む XHTML のすべてのページ)
- JPA Eclipselink
- 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 に渡すにはどうすればよいですか?