我正在使用 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,会怎么做?

有帮助吗?

解决方案

  1. 我不明白为什么注入 userDao 没有任何意义。

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

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

其他提示

添加到上面的回答,只是用构造函数注入,如果你不想在DAO二传手:

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

除非bean是不是你控制的一类,你并不需要使它一个Singleton,春将尽,默认情况下。

我个人不批注的风扇。

我的解决办法是具有与“认证”方法的接口。然后创建与一个构造函数在UserDAO的对象实现了接口的服务类。这样一来,需要的服务不执行实例(它是由春季完成),并不知道有什么底层实现的情况下(LDAP,SSO,简单的密码比较等)的对象。好像把工作做:P

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top