Model view controller 我应该如何从会话中检索登录用户并将其传递到我的业务层?

Model view controller 我应该如何从会话中检索登录用户并将其传递到我的业务层?,model-view-controller,jsf,business-logic-layer,Model View Controller,Jsf,Business Logic Layer,我在Weld中使用JSF、Hibernate和CDI。我的应用程序分为:视图(xhtml)、控制(请求/会话/视图范围的bean)、模型(实体)和业务(标记为应用程序范围的bean的BO) 我尽量使模型层和业务层与视图和控制分离,这意味着如果想要更改所有XHTML+控制bean,就可能不影响业务层和实体 我的问题是:业务层中有很多方法需要知道谁是登录用户(或者至少是他的个人资料),因为这将影响返回到控制层的结果 例如:当请求编辑用户列表时,管理员将收到包含所有注册用户的列表,经理将收到仅包含“低

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

我尽量使模型层和业务层与视图和控制分离,这意味着如果想要更改所有XHTML+控制bean,就可能不影响业务层和实体

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

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

我不想将会话Bean(包含登录用户)注入到我的业务层,因为这会导致耦合(意味着我不能在任何时候仅仅更改我的控制/视图层)

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

我最后的问题是:

  • 我这样做有什么问题吗?还是我想得太多了
  • 有更好的方法吗

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

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

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


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

    非常简单优雅的解决方案,非常感谢。我肯定会读到关于JAAS的链接。