我正在为 Intranet 构建一个 Web 应用程序。我需要实现单点登录,即根据用户的系统(PC/笔记本电脑)用户名对用户进行身份验证。直到今天我都非常高兴,因为每次我测试我的登录页面时,它基本上都会选择我的系统用户名并让我登录而无需输入用户名。这就是我所需要的。但是,今天只是为了从 Intranet 中的另一个系统测试我的应用程序,当我打开登录页面时,它仍然选择了我自己的用户名。只是为了让事情更清楚,例如。如果我的系统名称是 User1,则此登录页面会选择 User1 并通过数据库进行身份验证并将我带到主页。但是,当我从具有用户名 User2 的不同系统测试我的登录页面时。登录页面仍然选择了我自己的系统用户名,即
有人可以说明我的错误或我错过的内容。是用户名 = System.getProperty("user.name"); 从访问我的登录页面的不同系统中选择用户名的正确方法是什么?
关于配置的一些细节:
- Glassfish V3.1.2
- JSF2.0(XHTML 中的所有页面,包括登录页面)
- JPA Eclipse 链接
- 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?