我在8.1.0.Final版本中使用Wildfly。我正在通过REST服务通过HttpServletRequest进行身份验证,如下所示。

@Context
HttpServletRequest request;
...
request.login(user, password);

因此,我可以使用request.getUserPrincipal();获取记录的用户主体。

但是,来自Web层的登录身份不会传播到ejb层。如果我试图从ejb bean获取用户主体,则用户主体始终是“匿名”:
@Stateless
@SecurityDomain("other")
@PermitAll
public class FooBean implements Foo {

    @Resource
    private EJBContext ejbContext;

    public void someMethod() {
        String name = ejbContext.getCallerPrincipal().getName();
    }
}

有什么方法可以将登录的用户主体从Web层传递到ejb上下文中?

最佳答案

我一直在Wildfly 8.0.0.Final上获得Anonymous CallerPricipal或null UserPrincipal,直到我将补丁应用到Wildfly 8.1.0.Final为止,一切都很好。

我们的项目之间唯一明显的区别是,我不是使用@SecurityDomain而是使用xml来避免代码中的供应商特定信息。我建议您重新检查使用该批注的要求,或尝试使用xml看看是否仍然存在问题

我的jboss-web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<jboss>
    <security-domain>myJaasSecurityDomain</security-domain>
</jboss>

我的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">

    <security-role>
        <role-name>ADMIN</role-name>
    </security-role>
    <security-role>
        <role-name>CUSTOMER</role-name>
    </security-role>

</web-app>

希望下一个人不会像我一样花2天

09-17 15:14