Вопрос по ldap, jaas, spring-security, authentication, websphere – Используйте JAAS для пароля LDAP с безопасностью Spring

4

У меня есть веб-приложение Java EE, которое использует аутентификацию LDAP. Я использую Spring security для подключения к моему LDAP с помощью следующего кода:


    
    







    



    
        
            
            
        
    
    
        
            
        
    
    
    

На самом деле, мой бобWebsphereCredentials использует закрытый класс WebSphereWSMappingCallbackHandlerFactory как в этом ответе:Как получить доступ к псевдониму аутентификации из EJB, развернутого в Websphere 6.1

Мы можем видеть это в официальной документации Websphere:http://pic.dhe.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Frsec_pluginj2c.html

Но я нене хочу, потому что:

Я думаю, что мое приложение может получить доступ ко всем именам входа JAAS в моем экземпляре WebSphere (не уверен).Этот класс определен в клиентской библиотеке HUGE IBM com.ibm.ws.admin.client-7.0.0.jar (42 Mo) => Компиляция медленнее, нет в моем предприятии NexusЭто'не портативный, не стандартный

Для информации я определяюWebsphereCredentials конструктор как это:

Map map = new HashMap();

map.put(Constants.MAPPING_ALIAS, this.jndiAlias);
Subject subject;
try {
    CallbackHandler callbackHandler = WSMappingCallbackHandlerFactory.getInstance().getCallbackHandler(map, null);
    LoginContext lc = new LoginContext("DefaultPrincipalMapping", callbackHandler);
    lc.login();
    subject = lc.getSubject();
} catch (NotImplementedException e) {
    throw new EfritTechnicalException(EfritTechnicalExceptionEnum.LOGIN_CREDENTIAL_PROBLEM, e);
} catch (LoginException e) {
    throw new EfritTechnicalException(EfritTechnicalExceptionEnum.LOGIN_CREDENTIAL_PROBLEM, e);
}

PasswordCredential cred = (PasswordCredential) subject.getPrivateCredentials().toArray()[0];

this.user = cred.getUserName();
this.password = String.valueOf(cred.getPassword());

Есть ли способ использовать только безопасность Spring и удалить эту зависимость?

Я понятия не имею, как совместитьhttp://static.springsource.org/spring-security/site/docs/3.1.x/reference/jaas.html а такжеhttp://static.springsource.org/spring-security/site/docs/3.1.x/reference/ldap.html.

Может быть, я должен полностью изменить свой подход и использовать другой способ?>

ОГРОМНАЯ клиентская библиотека IBM com.ibm.ws.admin.client-7.0.0.jar (42 Mo) => Компиляция медленнее - хотя я понимаю необходимость избегать таких больших jar-файлов, обычно их наличие не замедляет компиляцию. Java не перекомпилирует фляги. Они связаны, но не скомпилированы. Arjan Tijms
Да ты прав. Я пишу это быстро ... Я говорю это, потому что, когда я заканчиваю компилировать, я копирую свои фляги для развертывания. Но этот jar предоставляется сервером приложений, и я уже отмечаю его как предоставленный в файле maven pom. ; О) Duff

Ваш Ответ

1   ответ
5

Я предполагаю, что ваша цель состоит в том, чтобы просто использовать имя пользователя / пароль, которые вы настраиваете в WebSphere для подключения к каталогу LDAP? В этом случае вы на самом деле не пытаетесь объединить аутентификацию на основе LDAP и JAAS. Поддержка JAAS действительно предназначена для использования JAAS.LoginModules для аутентификации пользователя вместо использования аутентификации на основе LDAP.

Если вы хотите получить имя пользователя и пароль без зависимости времени компиляции от WebSphere, у вас есть несколько вариантов.

Устранение зависимостей времени компиляции и времени выполнения в WAS

Один из вариантов - настроить пароль другим способом. Это может быть так же просто, как использовать пароль непосредственно в файле конфигурации, как показано наДокументация по Spring Security LDAP:


  
  
  

Вы также можете настроить пароль пользователя в JNDI. Другой альтернативой является использование файла .properties со свойством. Если вы хотите убедиться, что пароль защищен, то вы, вероятно, захотите зашифровать пароль, используя что-то вродеJasypt.

Устранение зависимостей времени компиляции и настройка с помощью WAS

Если вам нужно или вы хотите использовать WebSphere 'Поддержка J2C для хранения учетных данных, то вы можете сделать, введяCallbackHandler пример. Например, вашWebsphereCredentials Боб может быть что-то вроде этого:

try {
    LoginContext lc = new LoginContext("DefaultPrincipalMapping", this.callbackHandler);
    lc.login();
    subject = lc.getSubject();
} catch (NotImplementedException e) {
    throw new EfritTechnicalException(EfritTechnicalExceptionEnum.LOGIN_CREDENTIAL_PROBLEM, e);
} catch (LoginException e) {
    throw new EfritTechnicalException(EfritTechnicalExceptionEnum.LOGIN_CREDENTIAL_PROBLEM, e);
}

PasswordCredential cred = (PasswordCredential) subject.getPrivateCredentials().toArray()[0];

this.user = cred.getUserName();
this.password = String.valueOf(cred.getPassword());

Ваша конфигурация будет выглядеть примерно так:


    



    
      
        
          
            
          
        
      
    
    
      
    



отказ

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

Гибридный подход

Вы можете использовать гибридный подход, который всегда удаляет зависимость времени компиляции и позволяет вам удалить зависимость времени выполнения в тех случаях, когда вы, возможно, не работаете в WebSphere. Это может быть сделано путем объединения двух предложений и использованияПрофили определения Spring Bean провести различие между работой на WebSphere и на машине без WebSphere.

Небольшое изменение, я удаляю первый фабричный метод = "getCallbackHandler» в бобе userConnexion. Остальное в порядке, еще раз спасибо Duff
Рад слышать, что это помогло. Я обновил пост, чтобы отразить небольшое изменение, которое вы упомянули. Rob Winch
Спасибо за ваш ответ! На самом деле да, я хочу удалить свой пароль в файле конфигурации. Я предоставляю файл конфигурации для моей команды развертывания, но я нене знаю производственный пароль, которыйпочему я не могу иметь пароль. Для местных и разработчиков. Я уже использую Jasypt и Spring Profil в зависимости от окружающей среды. Мне нравится идея определить мою зависимость в моей весенней конфигурации. Извините, что неэто не так. Я уже предложил моей команде развертывания сохранить пароль в JNDI, но они нене хочу этого; о (. Большое спасибо за ваш ответ. Duff

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