0

我正在为 Intranet 构建一个 Web 应用程序。我需要实现单点登录,即根据用户的系统(PC/笔记本电脑)用户名对用户进行身份验证。直到今天我都非常高兴,因为每次我测试我的登录页面时,它基本上都会选择我的系统用户名并让我登录而无需输入用户名。这就是我所需要的。但是,今天只是为了从 Intranet 中的另一个系统测试我的应用程序,当我打开登录页面时,它仍然选择了我自己的用户名。只是为了让事情更清楚,例如。如果我的系统名称是 User1,则此登录页面会选择 User1 并通过数据库进行身份验证并将我带到主页。但是,当我从具有用户名 User2 的不同系统测试我的登录页面时。登录页面仍然选择了我自己的系统用户名,即

有人可以说明我的错误或我错过的内容。是用户名 = System.getProperty("user.name"); 从访问我的登录页面的不同系统中选择用户名的正确方法是什么?

关于配置的一些细节:

  1. Glassfish V3.1.2
  2. JSF2.0(XHTML 中的所有页面,包括登录页面)
  3. JPA Eclipse 链接
  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 代码不在网络浏览器中运行。它在物理上与网络服务器运行在同一台机器上。它不像网络浏览器那样在机器上运行。过程如下:

  1. 客户端(使用 Web 浏览器的用户)发送请求 HTML 页面的 HTTP 请求。
  2. 服务器(网络服务器)检索 HTTP 请求并执行所有 Java 代码。
  3. Java/JSF 代码产生 HTML 输出。
  4. 服务器将 HTML 输出作为代表 HTML 页面的 HTTP 响应发送回客户端。
  5. 客户端检索 HTML 页面并呈现它。

您的错误是您以某种方式期望 Java/JSF 代码在客户端运行。这是一个相当严重的误解。

基本上,为了在客户端运行 Java 代码,您需要创建一个Java 小程序Java web start<object> ,并通过元素将其嵌入到 HTML 输出中。这样,客户端将下载 Java 程序并在本地执行它(因此,在物理上与运行 web 浏览器的机器相同)。请注意,该环境通常是沙盒环境,您可能需要对其进行签名以获得更多权限,例如获取系统信息。

但是,对于您的具体功能要求,可能应该寻求完全不同的解决方案。查看单点登录 (SSO) 和/或 LDAP 等机制。有关详细信息,请联系服务器管理员。

于 2013-04-12T18:26:55.307 回答