更新对象属性

时间:2013-02-04 01:49:29

标签: java security struts2 passwords password-storage

我正在使用Struts 2,我的问题是我不想更新所有对象属性,因为我得到了一些敏感数据。

这是我的代码示例

public class person {
  private name;
  private email;
  private password;
}

在我的表单中,例如我显示更新的名称和电子邮件,因此当我在提交后更新我的人员属性时,该人的密码属性获取值null,但是当我将属性密码放在{{1更新表格中的标签工作正常。

如何在不使用表单中的隐藏标记的情况下使Struts 2记住密码的值?

2 个答案:

答案 0 :(得分:1)

如果您需要存储信息

  • 必须在请求中保持不变;
  • 不得在页面中显示;

然后您必须use the Session,通过实施SessionAware


那就是说,我不确定你应该存储用户密码,也不确定密码与用户的关联;

您应该在Web应用程序中创建一个登录页面,仅在该Action中处理密码,针对数据库(或其他)验证密码,并在Session中存储一些身份验证ID,而不是密码本身(您不会再次验证用户,除非会话过期,然后用户将被重定向到登录页面......不需要将密码保存在内存中。


也就是说,用户身份验证的最佳做法不鼓励根据数据库中存储的密码验证输入的密码;

您应该使用某种单向hashing algorithmadding a salt来阻止Rainbow Table攻击)来对密码进行哈希处理,并根据数据库中的哈希密码进行检查。这样,即使数据库管理员也不知道用户的密码,并且在忘记密码的情况下,它将被重置,而不是被检索。

在Java中,基于jBCryptBCrypt是最好的实现之一。

希望有帮助...


修改

作为从概念上分离您在Web应用程序中处理的对象的一种方法,您可以使用两个不同的bean:用于读取的“Full Bean”,具有所有属性,以及用于写入的“Subset Bean”,仅包含可能会改变的属性。

例如,ID和密码不应该更改...您可以从数据库中读取“完整”,然后写入JSP然后向数据库写入“子集”(除了在用户注册中,您将在其中写入全部)......

为了使其更容易理解,Full Bean是Dao Object映射到数据库字段,而Subset Bean是Presentation对象,您将通过仅复制所需的属性来创建Dao对象......它们都是DTO,但有两种不同的语义层次。

否则只需将你的bean放入会话中,它就是一行代码,你就可以了。

答案 1 :(得分:0)

您可以在服务器端检查“null”(或唯一值)值(如果它为null,则表示:没有更改。)。 或者您可以将此类用于更新请求

Public class person
{

  protected name;
  protected email;
}
Public class personNew: person // inherit from person
{
    private password;
}

我不使用“Struts 2”,而是使用我的Web应用程序(APS.NET C#)。我继续这样做