Вопрос по session, jboss, java, login, jboss6.x – Прослушивание событий входа в систему в JBoss AS 6

7

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

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

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

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

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

веснаacegi предоставляет ловушки и события для успешных входов и выходов, но не уверен, что это простое решение с простымJAAS кроме обходных путей. Если вы можете переключиться на пружинные acegi, это будет проще. RP-
Обходной путь, о котором я могу подумать,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 сам. RP-
@ Rp - К сожалению, в этом стеке приложений нет Spring, и, учитывая, что Spring и JBoss EJB, как правило, не очень хорошо играют вместе, я предпочел бы не идти по этому пути ... Erica
Это выглядит связаннымstackoverflow.com/questions/8124001/…, @Rp, вероятно, на правильном пути pd40
@ Rp- Я попробую. Это не так элегантно, как я бы надеялся, JBoss предоставит, но если это работает, это работает. Не могли бы вы опубликовать это как ответ? Таким образом, если больше ничего не проявится в ближайшие пару дней, я могу соответственно назначить награду. :) Erica

Ваш Ответ

3   ответа
3

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

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

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

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

Как насчет чего-то вроде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 Это также может пригодиться для отслеживания пользователей (сохранение информации о включении / выключении журнала в БД и т. Д.).

@gebuh, я не совсем понимаю вопрос. У меня есть доступ к конфигурации к политикам JAAS. Erica
@YvesMartin - включение его в фильтр сервлетов приведет к его запускуevery time доступ к ресурсу, а не только в первый раз после успешного входа в систему ... Или я неправильно понял? Erica
Насколько я понимаю, второй кусок кода должен быть помещен в фильтр сервлета ...
проблема с этим решением состоит в том, что мне все еще нужно куда-то поместить второй кусок кода. Его нужно вызывать, когда пользователь входит в систему, но у меня нет такого места. Вы упоминаете, что я не создаю объект, пока пользователь не войдет в систему - как определить, когда пользователь входит в систему? Это как раз то, куда я направлялся с этим вопросом. Erica
у вас есть доступ к модулям JAAS?
2

Обходной путь, о котором я могу подумать,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>

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

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

Похожие вопросы