2013-04-12 1 views
0

Я создаю веб-приложение для интрасети. И я должен был выполнить единый знак на i.e аутентифицировать пользователя на основе его системного (pc/laptop) имени пользователя. До сегодняшнего дня я был очень счастлив, так как каждый раз я тестировал свою страницу входа в систему, которая в основном выбирает имя моей системы и регистрирует меня, не запрашивая имя пользователя. Это то, что мне нужно. Однако сегодня просто для проверки моего приложения из другой системы в интранете, когда я открыл страницу входа в систему, он все равно взял свое собственное имя пользователя. Просто, чтобы сделать вещи более ясными здесь, например, напр. если имя моей системы User1, эта страница входа в систему shud подбирает User1 и проходит проверку подлинности с помощью базы данных и выводит меня на домашнюю страницу. Однако, когда я тестировал свою страницу входа из другой системы, которая имеет имя пользователя User2. Страница входа в систему по-прежнему загружала мое собственное имя пользователя системы, то есть User1, а не User2, так как я входил в систему из системы 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. На следующем шаге я совершенно не знаю. Попробовал ответить Google, но все, что я мог понять, это мне теперь написать javaScript? Чтобы установить значение имени пользователя, которое апплет взял. Может ли кто-нибудь, пожалуйста, направить меня сейчас, какой должен быть мой правильный следующий шаг? Как я могу передать системное имя пользователя в свой loginBean без запроса пользователя для ввода?

ответ

4

Код Java/JSF не запускается в веб-браузере. Он работает физически на той же машине, где работает веб-сервер. Он не запускается в машине, где работает веб-браузер. Процесс заключается в следующем:

  1. Клиент (пользователь с веб-браузером) отправляет HTTP-запрос, запрашивающий HTML-страницу.
  2. Сервер (веб-сервер) извлекает HTTP-запрос и выполняет весь код Java.
  3. Код Java/JSF создает HTML-выход.
  4. Сервер отправляет HTML-результат в виде ответа HTTP, представляющего HTML-страницу обратно клиенту.
  5. Клиент извлекает HTML-страницу и представляет ее.

Ваша ошибка в том, что вы как-то ожидали, что код Java/JSF работает на стороне клиента. Это довольно серьезное недоразумение.

В принципе, для запуска Java-кода на стороне клиента вам необходимо создать Java applet или 10 и вставить его в HTML-выход через элемент <object>. Таким образом, клиент загрузит программу Java и выполнит ее локально (таким образом, физически тот же компьютер, на котором работает веб-браузер). Обратите внимание, что эта среда обычно изолирована песочницей, вам может потребоваться ее подписать, чтобы иметь больше разрешений, таких как получение системной информации.

Однако для вашего конкретного функционального требования, вероятно, нужно искать совершенно другое решение. Посмотрите на механизмы, такие как единый вход (SSO) и/или LDAP. Для получения дополнительной информации обратитесь к администратору сервера.

+0

Большое спасибо !!! У меня действительно было неправильное впечатление. Теперь проблема в том, что у меня нет опыта в использовании LDAP/SSO, Java-апплета, можете ли вы предложить мне быстрое чтение/руководство для его использования? Это будет действительно большая помощь! Заранее большое спасибо! (Между тем, конечно, я попытаюсь прочитать все, что мог, из ссылки, которую вы уже предоставили в ответ) – sushantpandey

+0

Это ответственность администратора сервера, а не веб-разработчика. Но если вам интересно, найдите вокруг себя ключевые слова «[имя_сервера] sso ldap», например [this] (http://google.com/search?q=glassfish+sso+ldap) – BalusC

+0

Я обновил свой вопрос с помощью своего кода для апплета, а затем небольшой фрагмент из xhtml, который теперь внедряет мой апплет. Было бы действительно здорово, если бы кто-то теперь мог привести меня к следующему соответствующему шагу. Потому что, проведя так много времени на Google для следующего шага, я чувствую себя полностью перевернутым. Что я могу получить, так это то, что теперь мне нужно написать JavaScript, чтобы установить значение для имени пользователя? Пожалуйста, посоветуйте мне об этом. Большое спасибо!!! – sushantpandey