0

我将 JSF、Hibernate 和 CDI 与 Weld 一起使用。我的应用程序分为:视图(xhtml)、控制(请求/会话/视图范围的 Bean)、模型(实体)和业务(BO 标记为应用范围的 bean)。

我尽量让模型层和业务层与视图和控制层分离,这意味着如果要更改所有 xhtmls + 控制 bean,则可以在不影响业务层和实体的情况下进行。

我的问题是:业务层中有很多方法需要知道谁是登录用户(或至少是他的个人资料),因为这会影响将返回给控制层的结果。

例如:当请求编辑用户列表时,管理员将收到一个包含所有注册用户的列表,而经理将收到一个仅包含“低于”其个人资料的用户的列表。

我不想将我的会话 Bean(包含登录用户)注入我的业务层,因为这会导致耦合(这意味着我无法随时更改我的控制/视图层)。

现在我通过将登录用户作为我的 BO 方法的参数传递来做到这一点,但对我来说“感觉”是错误的。我一直认为控制层可以将它想要的任何人作为登录用户传递,而我的业务层永远不会知道它。

我最后的问题是:

  1. 我这样做的方式有什么问题吗?还是我想太多了?
  2. 有更好的方法吗?
4

1 回答 1

0

我认为将用户身份放在会话范围内很好,域层中的 bean 可以从中获取它。如果您的域层需要了解用户身份,那么它是一个域概念,在那里有一个对象是可以的。

但是,您应该担心从表示层泄漏抽象。我建议您在域层中为用户身份定义一个接口,域层中的代码是根据该接口编写的,然后从表示层注入它的实现。因为接口是在领域层定义的,所以可以根据领域概念来编写,防止表示概念泄漏到其中。

如果您想更改表示层,则需要编写接口的新实现,但这应该不是问题。

您可以采用另一种方法,即使用Java 身份验证和授权服务在用户身份传递到域层时将其绑定到执行线程。然后,该层中的对象可以使用标准 JAAS 构造来访问它。如果您的容器支持 JACC,那么它可能已经通过 JAAS 提供用户身份;我不太确定。

于 2012-07-19T21:01:46.363 回答