Jakarta ee 通过GlassFish中的应用程序客户端容器对用户进行身份验证是否过于雄心勃勃? 问题

Jakarta ee 通过GlassFish中的应用程序客户端容器对用户进行身份验证是否过于雄心勃勃? 问题,jakarta-ee,authentication,anonymous,application-client,acc,Jakarta Ee,Authentication,Anonymous,Application Client,Acc,当我在应用程序客户机的Main类中插入@EJB代理时,并且EJB有一个方法要求用户担任某个角色,那么应用程序客户机容器(ACC)将要求用户在应用程序客户机启动后立即登录。ACC不会区分客户想要调用什么方法,因此客户实际需要扮演什么角色(如果有的话)。实际上,这意味着,若EJB的一个方法有一个需要特定角色的方法,那个么我的客户机就不能正确地连接到服务器。如果我们用@PermitAll显式地注释EJB,这并不重要。ACC仍然会提示输入用户名和密码,如果没有给出,那么我的GlassFish 3.1.2

当我在应用程序客户机的
Main
类中插入@EJB代理时,并且EJB有一个方法要求用户担任某个角色,那么应用程序客户机容器(ACC)将要求用户在应用程序客户机启动后立即登录。ACC不会区分客户想要调用什么方法,因此客户实际需要扮演什么角色(如果有的话)。实际上,这意味着,若EJB的一个方法有一个需要特定角色的方法,那个么我的客户机就不能正确地连接到服务器。如果我们用
@PermitAll
显式地注释EJB,这并不重要。ACC仍然会提示输入用户名和密码,如果没有给出,那么我的GlassFish 3.1.2.2(build 5)实现将中止所有操作并显示“用户取消了身份验证”

设置您的测试环境! 声明一个远程接口,如下所示:

@Remote
public interface IRemoteEJB
{
String echoGuest(String returnMe);
String echoAdmin(String returnMe);
}
编写EJB(我的问题与单例有关,所以我不敢在这里使用另一个会话注释!):

至于客户端部分,下面是我能想到的最小可能实现:

public class Main
{
    @EJB private static remoteProxy;

    public static void main(String... args)
    {
        String reply = remoteProxy.echoGuest("Hello world!");
        JOptionPane.showMessageDialog(null, reply);
    }
}
结果 您认为客户端是否成功地对
echoGuest
方法进行了“匿名”调用?没有。我发现ACC甚至会在注入
@EJB
之前强制客户端提供用户名和密码。简单地说,如果我们不能从应用程序客户机混合访问EJB的身份验证。上面的解决方案是从
echoAdmin
方法中删除
@RolesAllowed(“admin”)
注释

在某种程度上,这是完全有道理的。ACC仅在客户机引导期间处于活动状态,这正是我们需要将所有注入的资源都放在
Main
类中的应用程序客户机中并使其
也成为静态的原因。ACC根本无法确切地知道EJB中哪些方法将被调用或不被调用


好的,但这是否违反了
@PermitAll
@RolesAllowed
注释的规范和预期行为?在这个世界上,我们是否无法为应用程序客户机提供对EJB的匿名访问权限,而EJB只有一个过时的、从未调用过的、需要特定角色的方法?到目前为止,我不仅要用我认为可以而且应该做的注释来分离这些方法,还要重构逻辑以完全分离EJB:s。感觉很难:“(

Java EE 7规范在第9页说,应用程序客户端的
部署和管理并不完全由该规范定义。因此,在应用程序客户端的“管理”方面,我们可以预期不同的、不可移植的行为

本规范在第41页和第42页继续讨论惰性身份验证:

与身份验证相关的成本 身份验证过程可能需要跨多个服务器交换多条消息 因此,最好使用惰性身份验证, 也就是说,仅在需要时执行身份验证 身份验证,用户无需进行身份验证,直到 访问受保护资源的请求

当第一层客户端(小程序、应用程序客户端)请求访问受保护的资源时,可以使用延迟身份验证 需要身份验证的

我无法解析此引用并判断规范是否需要惰性身份验证。显然,它不是。也就是说,GlassFish在我们访问受保护的资源(示例中的方法调用)之前就要求从我们的应用程序客户端进行身份验证时,不会违反任何规则

此外,规范真正触及了第44页的痛处:

所使用的技术可能会因应用程序的实施而有所不同 应用程序客户端容器,不受 应用

因此,我的最终判断必须是,规范不需要惰性身份验证,“技术”可能会有所不同

public class Main
{
    @EJB private static remoteProxy;

    public static void main(String... args)
    {
        String reply = remoteProxy.echoGuest("Hello world!");
        JOptionPane.showMessageDialog(null, reply);
    }
}