2012-02-20 42 views
1

我如何在CRUD模块的二进制类型列中存储二进制哈希密码?在纯JAVA中通常我使用Apache Commons编解码器库将二进制散列存储到postgresql bytea列中,但是我无法生成带有Model类或二进制散列的bytea列...请任何帮助。用playframework存储二进制密码哈希

在模型类别i中设置的属性作为BYTEA与注释如下

@Required 
@Column(nullable=false, columnDefinition="BYTEA NOT NULL") 
@Password 
public byte[] hash; 

,但CRUD控制器不显示的文本框把输入密码被散列的输入。

回答

2

的密码创建一个单独的@Transient String领域,从CRUD输入要填充:

@Password 
@Transient 
public String password; 

然后从你的散列字段中删除@Required注解。它不需要从CRUD填充。

接下来,创建一个新的方法,并与@PrePersist注释,所以它会被执行的模型保存之前:

@PrePersist 
public void prePersist() throws Exception { 
    this.hash = Codec.hexMD5(this.password.getBytes()); 
} 

UPDATE:

要让@Transient场出现在您的CRUD视图中,您需要自定义控制器的CRUD的blank视图。打开外壳/命令提示符并执行以下命令(用你的控制器类的实际名称取代“your_controller”):

play crud:ov --template your_controller/blank 

这应该在你的应用程序中的CRUD blank.html模板复制到views/your_controller/blank.html。打开该文件,寻找#{crud.form /}标签,并在它下面添加下面的代码:

<div class="crudField crud_password"> 
    <label for="object_password">&{'label.password'}</label> 
    <input id="object_password" type="password" name="object.password" value="" /> 
    <span class="crudHelp"></span> 
</div> 

密码字段现在应该出现在其他表单字段后。

+0

感谢您的回复。我正在探索在插入时触发哈希的数据库方式,但我会定义尝试您的响应。 – JuanToroMarty 2012-02-21 12:05:23

+0

@Transient字段不显示在Users CRUD表单中。我做错了什么? – JuanToroMarty 2012-02-21 15:15:18

+0

不,你说得对,我忘了@Transient字段不会自动出现在视图中。我用补充说明更新了我的答案。 – Tommi 2012-02-22 06:11:15