java - Java EE/JBoss AS 6 中的预身份验证用户

标签 java spring jakarta-ee jboss ejb

我正在将一些 Java EE 模块从 Spring 迁移到 EJB,现在面临着在调用服务方法之前需要某种预身份验证的问题。

这个问题其实很简单。调用来自内部协议(protocol)处理程序(某些线程启动专有协议(protocol)处理程序并使用自定义 TCP 协议(protocol)接收请求)。该连接尚未对用户进行身份验证,并且接下来想要调用服务方法。该服务方法需要主体信息(用户名)进行处理。

因此,在 Spring 中,我们只是将 SecurityContext 推送到本地线程,并在调用完成后将其删除。

协议(protocol)处理程序 -> 设置 SecContext -> 调用 -> 删除 SexContext -> 结束

Java EE/JBoss 中有类似的东西吗?我知道有“@RunAs”构造,但我不知道它们是否可以以编程方式使用。或者有没有办法使用 JAAS LoginContext 类“登录”?但是我该如何配置 JAAS 呢?

最佳答案

如果这纯粹是在 JAAS 上下文中获取身份的问题,那么您应该能够执行以下操作:

final String username; // get this from somewhere
Princpal principal = new Principal() {
    public String getName() {
        return username;
    }
};
Subject subject = new Subject(true, Collections.singleton(principal), Collections.emptySet(), Collections.emptySet());
Subject.doAs(subject, new PrivilegedAction<Void>() {
    public Void run() {
       // do your method call here
    }
});

请注意,您可以通过将 PrivilegedAction 绑定(bind)到 Void 以外的类型来返回该值,并通过实现 PrivilegedExceptionAction 来引发异常。

显然,如果您对主体是什么有更复杂的了解,您可以使用它(实现 toString、hashCode 和 equals 将是一个好主意)。

关于java - Java EE/JBoss AS 6 中的预身份验证用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7770316/

相关文章:

java - 为什么 spring 不能 Autowiring 简单类型?

java - hbm2ddl 模式导出不会导致使用 Spring Security 创建实体

jakarta-ee - 检查JTA事务是否提交成功

java - 如何确定 Java Webstart 应用程序运行测试还是生产?

java - fragment 内的布局未渲染

java - Spring MVC 奇怪的行为

spring - 我可以在没有注释的情况下使用 Spring 的缓存功能吗?

JavaEE6+REST : How do I get all REST resources at runtime?

java - 流 IllegalStateException

java - Spring 5 添加静态文件目录webapp