Как я должен передать субъект / принципалы / роли между уровнями приложения в Java? - PullRequest
1 голос
/ 24 февраля 2012

В настоящее время у меня есть несколько веб-приложений, которые обращаются к общему сервису, работающему в JBoss 5.0. Сервис очень прост с использованием Guice и POJO. Веб-приложения проходят проверку подлинности и знают, кто пользователь и какие роли он выполняет. При вызове службы, как я должен передать эту информацию аутентификации в службу?

Казалось бы, простой подход состоит в том, чтобы просто добавить параметр в интерфейс для получения пользовательской информации. Возможно Тема. Но у этого есть обратная сторона - загромождать интерфейс контекстной информацией, которая не относится к конкретной работе.

void doSomething(Subject subject, ...) {
}

Альтернатива, которую я видел, состоит в том, чтобы использовать хранилище ThreadLocal, помещать туда информацию о пользователе, прежде чем делать вызов, и сделать ее доступной через некоторый служебный класс, который может использовать служба. Это очищает интерфейс, но скрывает тот факт, что клиент службы должен установить информацию о пользователе перед выполнением вызова.

Есть ли другой способ сделать это? У меня такое ощущение, что АОП здесь тоже может быть полезным, но я не совсем понимаю, как это сделать. Есть ли какая-то «лучшая практика», по которой я скучаю? Поможет ли EJB?

Ответы [ 2 ]

1 голос
/ 26 февраля 2012

Это очищает интерфейс, но скрывает тот факт, что клиент Служба должна установить информацию о пользователе до совершения звонка.

Верно, но если вам нужно передать что-то определенному методу через приложение, то вы побеждаете цель использования Dependency Injection. Это сделано для того, чтобы вам не приходилось передавать кучу сервисов и объектов другим сервисам и объектам и т. Д., Они созданы со всем, что им нужно.

Есть ли другой способ сделать это? Я чувствую, что АОП может быть использования здесь, но не могу понять, как. Есть ли "лучшая практика" Я скучаю? Поможет ли EJB?

Другой способ сделать это - использовать один фильтр на каждом сервлете, который вызывает службы, которым нужен субъект / пользователь. Установите пользователя в фильтре и очистите пользователя в конце в блоке try-finally. Фактически, OWASP Esapi использует этот стиль при настройке своего ThreadLocalUser, он позволяет пользователю быть доступным во всех частях приложения.

Примерно так:

@Singleton
public MyUserFilter extends FilterOfTheMonth {

    private final Provider<Authenticator> authProvider;

    @Inject
    MyUserFilter(Provider<Authenticator> auth) {
        this.authProvider = auth;
    }

    public void doFilter(ServletRequest request, ServletResponse response, 
            FilterChain chain) throws java.io.IOException, ServletException {
        try {
            // Authenticate and SET the current user utilizing the request and/or                       
            // session objects
            authProvider.get().authenticateUser(HttpRequest currentRequest);

            // Continue on here along the servlet chain
            ... other processing
        } finally {
            authProvider.get().getRidOfCurrentUser();
        }
    }
}
0 голосов
/ 24 февраля 2012

Рассматривали ли вы перенос процесса аутентификации в общую службу? Тогда вам потребуется только идентификатор сеанса в общей службе, чтобы идентифицировать всю информацию о пользователе, от которого исходит запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...