Вопрос по session, jboss, java, login, jboss6.x – Прослушивание событий входа в систему в JBoss AS 6
У меня есть приложение, работающее в 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-
Вы можете добавитьServletFilter
реализация перед защищенным сервлетом.
При каждом вызове фильтр будет проверять логический флагnotFirstCall
вHttpSession
.
Если флаг отсутствует, запрос является первым после входа пользователя в систему. Может вызвать указанное задание, а затем установить флагnotFirstCall
отметить работу как выполненную для этой сессии.
Как насчет чего-то вроде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 Это также может пригодиться для отслеживания пользователей (сохранение информации о включении / выключении журнала в БД и т. Д.).
Обходной путь, о котором я могу подумать,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>
Надеюсь это поможет..