Прослушивание событий входа в систему в JBoss AS 6

У меня есть приложение, работающее в JBoss AS6. Аутентификация работает с использованием «ФОРМЫ» метод авторизации, и пользователь входит в систему правильно.

Я хотел бы иметь возможность вызывать фрагмент нестандартного статического кода всякий раз, когда пользователь успешно входит в систему.

К сожалению, я не могу найти ни слушателя, ни перехватчика, ни колбэка, который будет выполнять код при успешном входе в систему. HttpSessionListener имеет событие для «sessionCreated», но оно вызывается, как только пользователь получает доступ к любой странице, даже если он не вошел в систему. Это означает, что дажеviewing Форма входа запускает событие.

Может ли кто-нибудь указать мне некоторую документацию для JBoss AS 6 (или эквивалентную), в которой показано, как запускать пользовательский код в тот момент, когда пользователь впервые успешно входит в систему?

Заранее спасибо.

 RP-18 июн. 2012 г., 09:53
веснаacegi предоставляет ловушки и события для успешных входов и выходов, но не уверен, что это простое решение с простымJAAS кроме обходных путей. Если вы можете переключиться на пружинные acegi, это будет проще.
 RP-18 июн. 2012 г., 12:27
Обходной путь, о котором я могу подумать,CustomFormAuthenticator который расширяетсяorg.apache.catalina.authenticator.FormAuthenticator и зарегистрируйте его в/server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml, Теперь в Jboss AS 7 они представилиvalve концепция, где вы можете зарегистрироватьсяCustomAuthenticator в jboss-web.xml сам.
 Erica18 июн. 2012 г., 11:19
@ Rp - К сожалению, в этом стеке приложений нет Spring, и, учитывая, что Spring и JBoss EJB, как правило, не очень хорошо играют вместе, я предпочел бы не идти по этому пути ...
 pd4023 июн. 2012 г., 19:26
Это выглядит связаннымstackoverflow.com/questions/8124001/…, @Rp, вероятно, на правильном пути
 Erica23 июн. 2012 г., 03:12
@ Rp- Я попробую. Это не так элегантно, как я бы надеялся, JBoss предоставит, но если это работает, это работает. Не могли бы вы опубликовать это как ответ? Таким образом, если больше ничего не проявится в ближайшие пару дней, я могу соответственно назначить награду. :)

Ответы на вопрос(3)

Как насчет чего-то вродеjavax.servlet.http.HttpSessionBindingListener ? Create an object, populate it how you like when a user successfully logs in and add it as an attribute to the user's session. So:

public class User implements Serializable, HttpSessionBindingListener {
private String userId;
private Timestame logonTime;
// any additional fields

@Override
public void valueBound(HttpSessionBindingEvent event) {
// this method called when this object is attached to a session
    log.debug("user " + this.userId + "bound to a session - user logged in");
// do stuff
  }
@Override
  public void valueUnbound(HttpSessionBindingEvent event) {
// this method called when user's session ends, value unbound, etc
    log.debug("user " + this.userId + "logged off");
// do other stuff
  }

}

Чтобы связать объект:

// you don't create this object until a user logs in
User userObject = new User();
userObject.setUserId();
userObject.setLogonTime();
// get your request object however you normally get it
HttpServletRequest request.getSession().setAttribute("loggedInUser", userObject);

Когда атрибут установлен, он будет вызывать метод valueBound Это также может пригодиться для отслеживания пользователей (сохранение информации о включении / выключении журнала в БД и т. Д.).

 Erica24 июн. 2012 г., 08:54
@YvesMartin - включение его в фильтр сервлетов приведет к его запускуevery time доступ к ресурсу, а не только в первый раз после успешного входа в систему ... Или я неправильно понял?
 24 июн. 2012 г., 07:54
Насколько я понимаю, второй кусок кода должен быть помещен в фильтр сервлета ...
 Erica25 июн. 2012 г., 02:28
@gebuh, я не совсем понимаю вопрос. У меня есть доступ к конфигурации к политикам JAAS.
 Erica24 июн. 2012 г., 02:56
проблема с этим решением состоит в том, что мне все еще нужно куда-то поместить второй кусок кода. Его нужно вызывать, когда пользователь входит в систему, но у меня нет такого места. Вы упоминаете, что я не создаю объект, пока пользователь не войдет в систему - как определить, когда пользователь входит в систему? Это как раз то, куда я направлялся с этим вопросом.
 24 июн. 2012 г., 19:26
у вас есть доступ к модулям JAAS?
Решение Вопроса

Вы можете добавитьServletFilter реализация перед защищенным сервлетом.

При каждом вызове фильтр будет проверять логический флагnotFirstCall вHttpSession.

Если флаг отсутствует, запрос является первым после входа пользователя в систему. Может вызвать указанное задание, а затем установить флагnotFirstCall отметить работу как выполненную для этой сессии.

 Erica26 июн. 2012 г., 02:11
Это просто и совместимо с различными средами, и самое главное это работает, поэтому я отмечаю как принятый ответ. Жаль, что в JBoss нет более элегантного решения.

Обходной путь, о котором я могу подумать,CustomFormAuthenticator который расширяетсяorg.apache.catalina.authenticator.FormAuthenticator  и зарегистрируйте его в/server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml. Now in Jboss AS 7 they introduced valve concept where you can register CustomAuthenticator вjboss-web.xml iteself.

Что-то вроде..

public class CustomFormAuthenticator extends FormAuthenticator {
    @override
    public boolean authenticate(Request request, Response response, LoginConfig config) throws IOException {
        boolean authenticate = super.authenticate(request, response, config);
        //here you might need to keep track whether your custom/static code executed once or not,
        //just to avoid executing the same code again and again.
        if(authenticate) {
            int i = CustomSingleton.getInstnce().getExecuteCount();
            if(i <= 0) {
                //invoke custom code.
                //increment the count
                CustomSingleton.getInstnce().incrementExecuteCount();
            }
        }
    }
}

Теперь необходимо зарегистрировать это сserver в/server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml Добавить следующееentry вauthenticators раздел.

<entry>
    <key>CUSTOM-FORM</key>
    <value>full.qaulified.CustomFormAuthenticator</value>
</entry>

Затем в web.xml естьCUSTOM-FORM какauth-method

<login-config>
     <auth-method>CUSTOM-FORM</auth-method>
          <form-login-config>
               <form-login-page>/login.html</form-login-page>
               <form-error-page>/login-error.html</form-error-page>
          </form-login-config>
<login-config>

Надеюсь это поможет..

 29 мая 2013 г., 11:11
Я пытался исправить немного другую проблему (фиксацию сеанса) с JBoss 6.1, и это было именно то, что мне было нужно. Круто, спасибо!

Ваш ответ на вопрос