войти в качестве прокси для определенного пользователя

У нас есть требование, при котором пользователь-администратор должен быть прокси-сервером в качестве определенного пользователя в среде, где несколько пользователей (роль: пользователь) управляются администратором (роль: администратор).

например, если у нас есть следующие пользователи в базе данных (admin, user1, user2, user3), мы хотели бы, чтобы администратор использовал прокси как «user2» и использовал систему в определенных сценариях. Аутентификация в нашем веб-приложении основана на учетных данных имени пользователя/пароля, какие механизмы доступны для администратора для прокси-сервера как «user2», когда у него нет пароля для «user2». Как приложение может отслеживать такой доступ в целях аудита, чтобы указать, что «администратор» проксировал для «пользователя2» и выполнял определенные действия.

Я ищу предложения по поддержке этого в нашем веб-приложении j2ee (jboss seam).


person Sam    schedule 18.04.2010    source источник
comment
Что-то похожее на это (performancemanager.successfactors.eu/doc/roboHelp/) это то, что я ищу   -  person Sam    schedule 22.04.2010


Ответы (3)


Вы можете создать собственный метод registerAdminAsUser().

@Name("authenticationProxy")
public class AuthenticationProxy {

    private @In org.jboss.seam.security.Identity identity;

    /**
      * Starting with Seam 2.1+, you should use Credentials instead of Identity
      * To collect your username and password
      *
      * Your JSF Form should looks like
      *
      * <h:inputText value="#{credentials.username}"/>
      * <h:inputSecret value="#{credentials.password}"/>
      */
    private @In org.jboss.seam.security.Credentials credentials;

    public String registerAdminAsUser2() {

        identity.getCredentials().setUsername("user2");

        /**
          * Here you should provide any role which should be assigned to User2
          */
        identity.addRole("<A_ROLE>");
        identity.addRole("<OTHER_ROLE>");
        identity.addRole("<ANOTHER_ROLE>");

        /**
          * Do not call login method because it will call authenticate one
          * You do not have User2 password
          */
        // identity.login();

        return "loggedIn";
    }

    /**
      * Be aware you may need a unregisterAdminAsUser2
      */

}

А чтобы включить свой прокси, создайте commandButton

<h:commandButton value="register Admin as User2" value="#{authenticationProxy.registerAdminAsUser2}" rendered="#{credentials.username == 'admin'}"/>

Чтобы использовать какой-либо компонент JSF, сделайте следующее

<h:commandLink rendered="#{s:hasRole('<ANY_ROLE_ASSIGNED_TO_USER2_GOES_HERE>')}"/>

Я надеюсь, что это может быть полезно для вас!

person Arthur Ronald    schedule 25.04.2010
comment
Спасибо. Мы пытаемся имитировать вход в систему как user2 здесь, можно ли добавить определенные роли user2 к этому новому идентификатору. Если это так, нам не нужны никакие визуализированные проверки, которые что-то делают для «user2». - person Sam; 26.04.2010
comment
Будет ли «proxyedByAdmin» фиктивным паролем или настоящим паролем администратора? - person Sam; 26.04.2010
comment
@Samuel Можно ли добавить в эту новую личность роли, специфичные для пользователя 2 ??? Да, я обновлю ответ - person Arthur Ronald; 26.04.2010

Вы можете реализовать собственный метод аутентификации, который сначала проверяет user_name/user_pw, если это не удается, проверьте user_name/admin_pw, поэтому использование пароля администратора позволит войти в систему как любой пользователь.

15.3.2. Написание метода аутентификации

person stacker    schedule 22.04.2010
comment
Я не храню admin_pw в открытом виде, он присутствует в виде хэша MD5, поэтому я не смогу проверить user_name/admin_pw. - person Sam; 26.04.2010
comment
Тогда вы все еще можете вычислить MD5 из заданного пароля, прежде чем выполнять поиск. - person stacker; 26.04.2010

То, как я это делаю, обычно включает в себя сохранение двух идентичностей, я называю их логической и физической. Логическая идентификация используется для проверки авторизации, физическая — фактическая идентификация (пользователь, сидящий за клавиатурой). В обычных сценариях логическое удостоверение = физическое удостоверение, но чтобы позволить пользователю (обычно администратору) «действовать как» другой пользователь, вы можете изменить логическое удостоверение на целевого пользователя. Таким образом, приложение ведет себя в соответствии с логическим пользователем, но вы всегда отслеживаете, кто на самом деле сидит за компьютером с физическим пользователем. Надеюсь, это поможет.

person jtougas    schedule 22.04.2010