3

我正在使用 Stripes 和 Spring 构建一个 Web 应用程序。它需要具有登录/身份验证功能。现在,我将用户信息与用户凭据分开存储在数据库中。我的用户模型不包含凭据,因为我不想传递有价值的密码。

Spring 管理着我所有的 DAO。

现在,我正在实施一个基于非容器的安全系统。我存储密码的 sha-2 哈希值,并将表单中提交的密码与数据库中存储的密码进行比较。这种比较已经过测试并且有效。我试图弄清楚如何将这个东西连接在一起。现在我有一个 LoginActionBean 来捕获登录请求并使用一个“PasswordService”单例,该单例在内部使用 UserDAO 来检索凭据并与提交的参数进行比较。我的春豆是:

<bean id="passwordSerivce" class="com.example.store.authentication.PasswordService" factory-method="getInstance">
    <property name="userDAO" ref="userDAO"/>
</bean>

但是,PasswordService 单例需要一个:

public void setUserDAO(UserDAO userDAO) { ...}

在单例中没有真正意义的方法(UserDAO 是一个接口)。

我正在寻找合适的设计。我读过 ServiceLocators 是 Spring 被发明的原因。有什么想法吗?

我也想知道我还能如何设计这个。我有一个 ActionBean,当用户单击“登录”时会调用它,但我实际上如何进行身份验证。我是否将身份验证服务注入到 bean 中?我是否创建了一个任何人都可以调用的单例?我是否有一个 Spring 注入的 LoginAcionBean 使用的通用接口?如果我不使用 Spring,它将如何完成?

4

3 回答 3

1

添加到上述答案中,如果您不想要 DAO 的设置器,只需使用构造函数注入:

<bean id="passwordSerivce" class="...PasswordService">
   <constructor-arg ref="userDAO"/>
</bean>

除非 bean 不是您控制的类,否则您不需要将其设为 Singleton,Spring 默认会这样做。

我个人不喜欢注释。

于 2009-05-13T15:55:38.400 回答
1
  1. 我不明白为什么注入 userDao 没有任何意义。

  2. 我不明白为什么你的 xml 使用 factory-method="getInstance"; 你可以扔掉所有实例的东西和单例的东西;spring 将实例化密码服务类的单个实例并将其注入到许多需要它的类中,并且它们都将获得相同的实例。所以 spring 正在为你创建一个单例。密码服务类可以是一个简单的 pojo。对于 userDao 实现也是如此。

我还建议查看、理解和使用 spring 注释。基本上,您在将被注入的类上使用@Service,然后在注入它的类的设置器上使用@Autowired。您还需要在 xml 配置文件中添加一些内容以打开注释内容。

于 2009-05-13T00:36:27.820 回答
0

我的解决方案是有一个带有“身份验证”方法的接口。然后使用接受 UserDAO 对象的构造函数创建一个实现接口的服务类。这样,需要服务的对象不执行实例化(它由 spring 完成)并且不知道执行了哪些底层实现(ldap、SSO、简单密码比较等)。似乎完成了工作:P

于 2009-05-16T01:32:19.020 回答