gpt4 book ai didi

java - 我应该如何在 Java 的应用程序层之间传递主题/主体/角色?

转载 作者:太空宇宙 更新时间:2023-11-04 08:21:35 24 4
gpt4 key购买 nike

我目前有许多 Web 应用程序访问在 JBoss 5.0 中运行的公共(public)服务。该服务非常简单,使用 Guice 和 POJO。 Web 应用程序经过身份验证并知道用户是谁以及他们具有什么角色。当调用服务时,我应该如何将此身份验证信息传递给服务?

看起来简单的方法就是简单地向界面添加一个参数来获取用户信息。可能是一个主题。但这有一个缺点,即界面中包含并非特定于手头工作的上下文信息。

void doSomething(Subject subject, ...) {
}

我看到的替代方案是使用 ThreadLocal 存储,在调用之前将用户信息放入其中,并通过服务可以使用的某些实用程序类来访问该信息。这清理了界面,但隐藏了服务客户端必须在调用之前设置用户信息的事实。

还有其他方法可以做到这一点吗?我感觉 AOP 在这里也可能有用,但不太明白如何使用。我缺少一些“最佳实践”吗? EJB 有帮助吗?

最佳答案

This cleans up the interface but hides the fact that the client of the service has to set the user information before making the call.

确实如此,但如果您需要在应用程序中将某些内容传递给特定方法,那么您就违背了使用依赖注入(inject)的目的。它的存在使您不必将一堆服务和对象传递给其他服务和对象等等,它们是用它们需要的一切来创建的。

Is there another way of doing this? I get the feeling the AOP may be of use here too but can't quite see how. Is there some "best practice" I am missing? Would EJB help?

另一种方法是在每个调用需要主题/用户的服务的 Servlet 上使用单个过滤器。在过滤器中设置用户,并在 try-finally block 的最后清除用户。事实上,OWASP Esapi在设置 ThreadLocalUser 时使用此样式,它允许用户在应用程序的每个部分中可用。

类似这样的事情:

@Singleton
public MyUserFilter extends FilterOfTheMonth {

private final Provider<Authenticator> authProvider;

@Inject
MyUserFilter(Provider<Authenticator> auth) {
this.authProvider = auth;
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws java.io.IOException, ServletException {
try {
// Authenticate and SET the current user utilizing the request and/or
// session objects
authProvider.get().authenticateUser(HttpRequest currentRequest);

// Continue on here along the servlet chain
... other processing
} finally {
authProvider.get().getRidOfCurrentUser();
}
}
}

关于java - 我应该如何在 Java 的应用程序层之间传递主题/主体/角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9434880/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com