Как сделать систему с синглтоном объекта-защитника (Guice + OWASP ESAPI)
-
25-10-2019 - |
Вопрос
В настоящее время я использую OWASP ESAPI для управления аутентификацией в своем веб -приложении Java, и я ввожу MyAuthenticator Singleton Myauthenticator Guice.injectmembers (это). Я хотел бы отойти от этого подхода и использовать объект, созданный в синглтоне. Мне понравилась безопасность нити эсапи синглтона и безопасность синглтонов в целом, используя двухпровернутую блокировку, идиому iodh или стиль экземпляра Bloch's Enum.
Что мне нужно сделать с моему гигицифуфицированному Singleton-Shoped Authenticator, чтобы сделать его безопасным, а также с потоком поля, которое я использую, чтобы получить и установить моего текущего пользователя?
Я хотел бы заставить все приложение работать с инъекцией зависимости, но не хочу, чтобы оно нарушало параллельный доступ к веб-приложению. Есть предложения или общие ловушки?
Threadlocal объект, который я использую, выглядит как код ниже:
private final ThreadLocalUser currentUser = new ThreadLocalUser();
private class ThreadLocalUser extends InheritableThreadLocal<User> {
@Override
public User initialValue() {
return User.ANONYMOUS;
}
public User getUser() {
return super.get();
}
public void setUser(User newUser) {
super.set(newUser);
}
}
Решение
К сожалению, я недостаточно знаю о Owasp Esapi, чтобы дать конкретный ответ, но вам может повезло, если вы рассмотрим поддержку Guice AOP. Вы можете перехватить все вызовы метода в классе и обеспечить любое поведение параллелизма, которое вам нравится.
Другие советы
Будьте осторожны, используя рисунок «Двойной контроль» в Java. Этот шаблон дизайна не надежно работает на Java (например, см. http://www.cs.umd.edu/~pugh/java/memorymodel/doublecheckedlocking.html) пока не Вы объявляете экземпляр Синглтона как "нестабильный".