我正在使用Stripes和Spring构建一个web应用程序。它需要具有登录/身份验证功能。现在,我将用户信息与用户凭证分开存储在数据库中。我的用户模型不包含凭据,因为我不想传递有价值的密码。
Spring管理着我所有的DAO。
现在,我正在实现一个基于非容器的安全系统。我存储了密码的sha-2散列,并对表单中提交的密码与数据库中存储的密码进行了比较。这种比较已经过测试,并且是有效的。我在想怎么把这东西连在一起。现在,我有一个捕获登录请求的LoginActionBean,并使用一个"PasswordService“单例,该单例在内部使用UserDAO来检索凭据并与提交的参数进行比较。我的spring bean是:
<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吗?我要创建一个任何人都可以调用的单例吗?我有没有一个LoginAcionBean使用的通用接口来注入Spring?如果我没有使用Spring,那该怎么做呢?
发布于 2009-05-13 00:36:28
userDao也是如此
我还建议查看、理解和使用spring注释。基本上,您可以在将要注入的类上使用@Service,然后在注入它的类中的setter上使用@Autowired。您还需要在xml配置文件中添加一些内容来打开注释内容。
发布于 2009-05-13 15:55:38
除了上面的答案,如果你不想为DAO设置一个setter,那么就使用构造函数注入:
<bean id="passwordSerivce" class="...PasswordService">
<constructor-arg ref="userDAO"/>
</bean>除非bean不是您控制的类,否则您不需要将其设置为Singleton,Spring将默认这样做。
我个人并不喜欢注释。
发布于 2009-05-16 01:32:19
我的解决方案是有一个带有"authenticate“方法的接口。然后创建一个服务类,它使用一个接受UserDAO对象的构造函数来实现接口。这样,请求服务的对象不会执行实例化(它是由spring完成的),并且不知道执行了什么底层实现(ldap、SSO、简单的密码比较等)。似乎完成了工作:P
https://stackoverflow.com/questions/855501
复制相似问题