2017-02-17 1 views
0

Пример конфигурации пружины приведен ниже.Как использовать зашифрованный накопитель в Spring ImapIdleChannelAdapter

<int-mail:imap-idle-channel-adapter id="mailAdapter" 
    store-uri="imaps://${"username"}:${"password"}@imap-server:993/INBOX" 
    java-mail-properties="javaMailProperties" 
    channel="emails" 
    should-delete-messages="false" 
    should-mark-messages-as-read="true"> 
</int-mail:imap-idle-channel-adapter> 

Я хочу сохранить поле пароля зашифрованным в файле свойств и расшифровать его в коде. Я не уверен, как установить свойство mailReceiver ImapIdleChannelAdapter в мою пользовательскую версию ImapMailReceiver. Пожалуйста, дайте мне знать, если есть какой-либо способ сделать это.

Все мои конфигурации представлены в XML, как описано выше. Выше решение о добавлении defifnation не работает, возможно, я делаю что-то неправильно. Затем я попытался использовать конфигурацию XML + Java, как показано ниже.

@Configuration 
public class EmailConfiguration { 
    @Bean 
    public ImapIdleChannelAdapter customAdapter() { 
     ImapIdleChannelAdapter adapter = new ImapIdleChannelAdapter(mailReceiver()); 
     adapter.setOutputChannel(outputChannel()); 
     adapter.setErrorChannel(errorChannel()); 
     adapter.setAutoStartup(true); 
     adapter.setShouldReconnectAutomatically(true); 
     adapter.setTaskScheduler(taskScheduler()); 
     return adapter; 
    } 

    @Bean 
    public TaskImapMailReceiver mailReceiver() { 
     TaskImapMailReceiver mailReceiver = new TaskImapMailReceiver("imaps://[username]:[password]@imap.googlemail.com:993/inbox"); 
     mailReceiver.setShouldDeleteMessages(false); 
     mailReceiver.setShouldMarkMessagesAsRead(true); 
     //mailReceiver.setJavaMailProperties(javaMailProperties()); 
     mailReceiver.setMaxFetchSize(Integer.MAX_VALUE); 
     return mailReceiver; 
    } 
} 

Также создается пустой errorChannel, outputChannel и т.д. Я заметил, что Spring создает два экземпляра одного с XML-конфигурации и другие с Java @Configuration. Там, где предполагается использовать только java-конфигурацию. Если я удалю xml config tag , то он предоставит экземпляр img экземпляра mymailReceiver, но работает только один раз, не периодически. также не отображает журналы IMAPS.

Просто интересно, нужно ли мне так много сделать, чтобы зашифровать пароль. Что-то не так с моим подходом.

ответ

0

конфигурации Использование Java вместо XML ...

@Configuration 
public class MyConfigClass { 

    @Bean 
    public MyMailReceiver receiver() { 
     ... 
    } 

    @Bean 
    public ImapIdleChannelAdapter adapter() { 
     ImapIdleChannelAdapter adapter = new ImapIdleChannelAdapter(receiver()); 
     ... 
     return adapter; 
    } 

} 

Если вы используете XML для всего остального, просто добавить этот класс как <bean/> вашему XML.

EDIT

Вот пример, который отлично работает для меня ...

@SpringBootApplication 
public class So42298254Application { 

    public static void main(String[] args) { 
     SpringApplication.run(So42298254Application.class, args); 
    } 

    @Bean 
    public TestMailServer.ImapServer imapServer() { 
     return TestMailServer.imap(0); 
    } 

    @Bean 
    public ImapMailReceiver receiver() { 
     ImapMailReceiver imapMailReceiver = new ImapMailReceiver(imapUrl("user", "pw")); 
     imapMailReceiver.setHeaderMapper(new DefaultMailHeaderMapper()); // converts the MimeMessage to a String 
     imapMailReceiver.setUserFlag("testSIUserFlag"); // needed by the SI test server 
     Properties javaMailProperties = new Properties(); 
     javaMailProperties.put("mail.debug", "true"); 
     imapMailReceiver.setJavaMailProperties(javaMailProperties); 
     return imapMailReceiver; 
    } 

    private String imapUrl(String user, String pw) { 
     return "imap://" 
       + user + ":" + pw 
       + "@localhost:" + imapServer().getPort() + "/INBOX"; 
    } 

    @Bean 
    public ImapIdleChannelAdapter adapter() { 
     ImapIdleChannelAdapter adapter = new ImapIdleChannelAdapter(receiver()); 
     adapter.setOutputChannelName("handleMail"); 
     return adapter; 
    } 

    @ServiceActivator(inputChannel = "handleMail") 
    public void handle(String mail, @Header(MailHeaders.FROM) Object from) { 
     System.out.println(mail + " from:" + from); 
     imapServer().resetServer(); // so we'll get the email again 
    } 

} 
+0

Выше решение не работает. Дайте мне знать, если я что-то делаю неправильно. – Chandra

+0

Спасибо за ответ, Отредактировав вопрос после реализации вашего решения, не могли бы вы предложить, где я иду не так. – Chandra

+0

Ваша конфигурация выглядит нормально; вам нужно удалить адаптер из XML. Я просто написал приложение быстрой загрузки, чтобы протестировать его на тестовом сервере электронной почты в тесте spring-integration-test, и он отлично работает для меня - см. Редактирование моего ответа. –

0

Мое намерение использовать зашифрованные пароли в файлах свойств. Итак, я изменил свой подход к занятиям по электронной почте. Я добавил унаследованный PropertyPlaceholderConfigurer и реализовал метод convertPropertyValue(), как показано ниже.

public class EncryptationAwarePropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer { 
    private static final Logger logger = LoggerFactory.getLogger(EncryptationAwarePropertyPlaceholderConfigurer.class); 

    @Override 
    protected String convertPropertyValue(String originalValue) { 
     if (originalValue.contains("{<ENC>}") && originalValue.contains("{</ENC>}")) { 
      String encryptedTaggedValue = originalValue.substring(originalValue.indexOf("{<ENC>}"), originalValue.indexOf("{</ENC>}") + 8); 
      String encryptedValue = originalValue.substring(originalValue.indexOf("{<ENC>}") + 7, originalValue.indexOf("{</ENC>}")); 

      try { 
       String decryptedValue = EncrypDecriptUtil.decrypt(encryptedValue);//EncrypDecriptUtil is my class for encription and decryption 
       originalValue = originalValue.replace(encryptedTaggedValue, decryptedValue); 
      } catch (GeneralSecurityException e) { 
       logger.error("failed to decrypt property returning original value as in properties file.", e); 
      } 
     } 
     return originalValue; 
    } 
} 

И измененные свойства файла вложить зашифрованное значение в custuom ENC тег в

mail.imap.task.url=imap://username:{<ENC>}encryptedPassword{</ENC>}@imap.googlemail.com:993/inbox 
Смежные вопросы