2015-06-30 51 views
3

加载加密值我是新来的Java定制注释我如何可以存储和使用自定义注释

我开发一个自定义的注释,其加密和解密字符串 和使用的弹簧和MongoDB其存储在数据库和加密我使用jasypt。

我没有得到确切的程序来这样做。

我的代码。

实体

public class Demo { 

    @Id 
    private Long id; 

    private String somethingPublic; 

    @EncryptDemo() 
    private String somethingPrivate; 

    //getter setter 

} 

定制标注

@Target({ ElementType.METHOD, ElementType.FIELD }) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface EncryptDemo { 

} 

如何添加的加密行为,以我的自定义注释之前,我存储的实体。

我应该在哪里添加加密代码,以便在调用时反映我的注释。

我想开发一个像hibernate一样的注释。

任何帮助将不胜感激。提前致谢。

+0

我做了一个库,只是你想要的:https:// gi thub.com/agoston/spring-data-mongodb-encrypt –

+0

请看看这篇文章,它符合您的要求 http://www.rhyous.com/2012/05/26/aop-encrypting-with- aspectj-using-an-annotation/ –

回答

3

通常,你需要是

  1. 创建AbstractMongoEventListener监听AfterConvertEventBeforeSaveEvent事件
  2. 实施org.springframework.util.ReflectionUtils.FieldCallback回调对这些事件做动作
  3. 注册听众为豆在Spring数据mongodb配置类

听众:

public class EncryptionMongoEventListener extends AbstractMongoEventListener<Object> { 
    @Override 
    public void onBeforeSave(BeforeSaveEvent<Object> event) { 
     Object source = event.getSource(); 
     DBObject dbObject = event.getDBObject(); 
     ReflectionUtils.doWithFields(source.getClass(), 
      new EncryptCallback(source, dbObject), 
      ReflectionUtils.COPYABLE_FIELDS); 
    } 
    @Override 
    public void onAfterConvert(AfterConvertEvent<Object> event) { 
     Object source = event.getSource(); 
     ReflectionUtils.doWithFields(source.getClass(), 
      new DecryptCallback(source), 
      ReflectionUtils.COPYABLE_FIELDS); 
    } 
} 

加密回调:

class EncryptCallback implements FieldCallback { 
    private final Object source; 
    private final DBObject dbObject; 

    public EncryptCallback(final Object source, final DBObject dbObject) { 
     this.source = source; 
     this.dbObject = dbObject; 
    } 

    @Override 
    public void doWith(Field field) 
     throws IllegalArgumentException, IllegalAccessException { 
     if (!field.isAnnotationPresent(/* your annotation */.class)) { 
      return; 
     } 
     ReflectionUtils.makeAccessible(field); 
     String plainText = (String) ReflectionUtils.getField(field, source); 
     String encryptedValue = /* your encryption of plainText */; 
     // update the value in DBObject before it is saved to mongodb 
     dbObject.put(field.getName(), encryptedValue); 
    } 
} 

解密回调:

class DecryptCallback implements FieldCallback { 
    private final Object source; 

    public DecryptCallback(Object source) { 
     this.source = source; 
    } 

    @Override 
    public void doWith(Field field) 
     throws IllegalArgumentException, IllegalAccessException { 
     if (!field.isAnnotationPresent(/* your annotation */.class)) { 
      return; 
     } 
     ReflectionUtils.makeAccessible(field); 
     String fieldValue = (String) ReflectionUtils.getField(field, source); 
     String decryptedValue = /* your decryption of fieldValue */; 
     // set the decrypted value in source Object 
     ReflectionUtils.setField(field, source, decryptedValue); 
    } 
} 

最后,注册听众为你的Spring数据MongoDB的配置类豆

@Bean 
public EncryptionMongoEventListener encryptionMongoEventListener() { 
    return new EncryptionMongoEventListener(); 
} 
+0

如何处理不同数据类型的字段,如日期字段? –