2013-04-12 14 views
0

我正在爲Intranet構建Web應用程序。我需要實現單點登錄,即基於他的系統(PC /筆記本電腦)用戶名對用戶進行身份驗證。直到今天,我非常高興,因爲每次我測試我的登錄頁面時,基本上都會選擇我的系統用戶名,並且不需要用戶名就可以登錄。那是我需要的。但是,今天只是爲了在我打開登錄頁面時從Intranet中的另一個系統測試我的應用程序,它仍然選取了我自己的用戶名。只是爲了讓事情更清楚一點就是例如。如果我的系統名稱爲User1,則此登錄頁面將啓動User1並向數據庫進行身份驗證,並將我帶到主頁。但是,當我從具有用戶名User2的不同系統測試我的登錄頁面時。登錄頁面仍然選取我自己的系統用戶名,即User1而不是User2,因爲我從系統User2登錄。如何獲取打開我的網頁的系統的用戶名

有人可以拋出我的錯誤或我錯過了包括的東西。是username = 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; 
     } 
    } 

OK,所以我想以我目前的研究結果,什麼我實現了一個前一陣子延長我的問題。下面是我寫的從系統獲取用戶名的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?爲了設置applet拾取的用戶名的值。現在有誰可以引導我,下一步應該是什麼?我現在怎麼能傳遞系統用戶名到我的loginBean而不提示用戶輸入?

回答

4

Java/JSF代碼不能在網頁瀏覽器中運行。它運行在與運行Web服務器的機器相同的機器上。它不會在網絡瀏覽器運行的位置運行。過程如下:

  1. 客戶端(帶有webbrowser的用戶)發送一個請求HTML頁面的HTTP請求。
  2. 服務器(網絡服務器)檢索HTTP請求並執行所有Java代碼。
  3. Java/JSF代碼生成HTML輸出。
  4. 服務器將HTML輸出作爲表示HTML頁面的HTTP響應發送回客戶端。
  5. 客戶端檢索HTML頁面並呈現它。

你的錯誤在於你以某種方式期望Java/JSF代碼在客戶端運行。這是一個相當大的誤解。

基本上,爲了在客戶端運行Java代碼,您需要創建一個Java appletJava web start並通過<object>元素將其嵌入到HTML輸出中。這樣客戶端將下載Java程序並在本地執行它(因此,在物理上與web瀏覽器運行的機器相同)。請注意,該環境通常是沙盒環境,您可能需要對其進行簽名才能擁有更多權限,例如獲取系統信息。

但是,對於您的具體功能要求,應該尋求完全不同的解決方案。查看單點登錄(SSO)和/或LDAP等機制。詳情請聯繫服務器管理員。

+0

非常感謝!我真的受到了錯誤的印象。現在的問題是,我沒有使用LDAP/SSO的經驗,Java applet可以請你給我推薦一個快速閱讀/使用指南來實現這個功能嗎?這將非常有幫助!提前感謝! (同時當然我會嘗試閱讀你已經提供的答案中的所有鏈接) – sushantpandey

+0

這是服務器管理員的責任,而不是Web開發人員。但如果您有興趣,請使用關鍵字「[servername] sso ldap」進行搜索,例如[this](http://google.com/search?q=glassfish+sso+ldap) – BalusC

+0

我用我的代碼更新了我的問題爲小程序,然後從xhtml小片段,現在嵌入我的小程序。如果有人現在可以引導我進入下一個適當的步驟,那將是非常棒的。因爲在下一步在Google上花費了很多時間之後,我感覺完全顛倒了。什麼最好的我可以拿起是現在我必須寫JavaScript來設置用戶名的值?請在這方面給我建議。非常感謝!!! – sushantpandey

相關問題