我正在使用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?我创建一个任何人都可以打电话的单身人士吗?我是否有一个LoginAcionBean使用哪个Spring注入的通用接口?如果我没有使用Spring,它会怎么做?
答案 0 :(得分:1)
我不明白为什么注入userDao没有任何意义。
我不明白为什么你的xml使用的是factory-method =“getInstance”;你可以扔掉所有的实例和单例东西; spring将实例化密码服务类的单个实例并将其注入到许多类需要的实例中,并且它们都将获得相同的实例。所以春天正在为你创造一个单身人士。密码服务类可以是一个简单的pojo。同样适用于userDao实现。
我还建议查看,理解和使用弹簧注释。基本上你在要注入的类上使用@Service,然后在注入它的类中的setter上使用@Autowired。您还需要在xml配置文件中添加一些内容以打开注释内容。
答案 1 :(得分:1)
添加上面的答案,如果你不想要DAO的setter,只需使用构造函数注入:
<bean id="passwordSerivce" class="...PasswordService">
<constructor-arg ref="userDAO"/>
</bean>
除非bean不是你控制的类,否则你不需要将它设为Singleton,Spring默认会这样做。
我个人不是注释的粉丝。
答案 2 :(得分:0)
我的解决方案是使用“authenticate”方法的接口。然后创建一个服务类,该服务类使用接收UserDAO对象的构造函数实现接口。这样,需要服务的对象不执行实例化(它由spring完成)并且不知道执行什么底层实现(ldap,SSO,简单密码比较等)。似乎完成了工作:P