2015-05-05 8 views
3

Я разработал модуль аутентификации безопасности (SAM) и реализовал метод validateRequest. У меня также есть простой webapp, настроенный для использования этого SAM.Как сохранить аутентифицированного пользователя в JASPIC?

В моем validateRequest метод, я проверить clientSubject и установить CallerPrincipalCallback с закодированного имени пользователя и GroupPrincipalCallback с закодированного названием группы:

final CallerPrincipalCallback callerPrincipalCallback = new CallerPrincipalCallback(clientSubject, "anonymous"); 
final GroupPrincipalCallback groupPrincipalCallback = new GroupPrincipalCallback(clientSubject, new String[] {"user"}); 

try { 
    this.handler.handle(new Callback[] {callerPrincipalCallback, groupPrincipalCallback}); 
} catch (IOException | UnsupportedCallbackException e) { 
    logger.error(e.getMessage()); 
} 

Я заметил, что каждый раз, когда я обновить сервлет в моем веб-приложение, то при условии клиента просто пустое, logger.debug("Client: {}", clientSubject);:

2015-05-05 11:21:02,200 DEBUG n.m.j.s.Saml2AuthModule [http-listener-1(2)] Client: Subject: 

можно ли «сохранить» тему как-то так, что субъект присоединяется к сессии, и я могу просто пропустить регистрацию в s- ame пользователь каждый раз?

EDIT Я думаю, я нашел способ вручную хранить его в HttpSession: req.getSession().setAttribute("subject", user); Не очень, но это работает.

ответ

4

Возможно ли «сохранить» тему каким-либо образом, чтобы объект был прикреплен к сеансу, и я могу просто пропускать ведение журнала одним и тем же пользователем каждый раз?

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

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

Способ сделать это первая установкой булева в информационном сообщении карты перед возвращением УСПЕХА и выход validateRequest:

messageInfo.getMap().put("javax.servlet.http.registerSession", TRUE.toString()); 

Тогда в начале каждого запрос Ваш модуль аутентификации (SAM) еще называют, но вы можете выполнить следующий «протокол», чтобы повторно использовать сохраненные идентификационные данные (имя пользователя + роли):

HttpServletRequest request = (HttpServletRequest) messageInfo.getRequestMessage(); 
Principal userPrincipal = request.getUserPrincipal(); 

if (userPrincipal != null) { 
    handler.handle(new Callback[] { 
     new CallerPrincipalCallback(clientSubject, userPrincipal) } 
    ); 

    return SUCCESS; 
} 

Я написал blog entry с еще несколько деталей. Вы можете найти тест, который использует полностью рабочий пример в Java EE 7 samples project.

К сожалению, в JASPIC нет функциональности, чтобы сказать, что вы не хотите, чтобы SAM назывался вообще, пока сессия (http) действительна.

Если вы ухаживаете за эту функцию, то, пожалуйста, голосовать за следующий вопрос: https://java.net/jira/browse/JASPIC_SPEC-20

Я думаю, я нашел способ вручную хранить его в HttpSession:. Req.getSession() SetAttribute ("субъект «, пользователь); Не очень, но это работает.

Более или менее «официальный» способ хранить имя пользователя и роли внутри сессии, а затем в начале каждого вызова validateRequest проверки, если эти данные есть, и если да, передать его двух обратных вызовов ,

Метод, показанный выше, на самом деле не похож на этот, но помимо очевидных различий (один обратный вызов против двух, получение принципала из запроса и получение его из сеанса), основное отличие состоит в том, что через полуавтоматический способ, которым контейнер свободен использовать любой механизм, который он должен хранить данные.

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

+1

Спасибо, Аржан, я знаю, что вы очень хорошо разбираетесь в этом вопросе (нашли много сообщений в блоге от вас) и искали способ связаться. Я рад, что ты меня нашел. :) – Davio

+0

@Davio приветствую вас, надеюсь, что ответ будет полезен;) –

+0

Очень полезно, я рад, что я не единственный, кто думает, что это упущение в текущих спецификациях, я отдам свой голос. – Davio

Смежные вопросы