使用Keycloak的安全JEE应用程序具有匿名的SessionContext.getCallerPrincipal()

时间:2018-03-19 15:11:12

标签: java java-ee keycloak

我有一个使用Keycloak保护的JEE服务(JaxRx),验证工作正常,但当我想用@RolesAllowed应用安全性时,我得到了EJBAccessException

该服务部署在Wildfly 11中,关于文档,我使用@SecurityDomain("keycloak")和下一个配置文件(jboss-ejb3.xml)将安全上下文传播到EJB层。

<?xml version="1.0" encoding="UTF-8"?>
<jboss:jboss
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:jboss="http://www.jboss.com/xml/ns/javaee"
    xmlns:s="urn:security:1.1"
    version="3.1" impl-version="2.0">

  <assembly-descriptor>
    <s:security>
      <ejb-name>*</ejb-name>
      <s:security-domain>keycloak</s:security-domain>
    </s:security>
  </assembly-descriptor>
</jboss:jboss>

我在Wildfly中安装了keycloak security-domain

我正在检查,我看到SessionContext没有用户,但Web Context有它。

enter image description here

如图所示,请求用户在RequestContext中被标识,但在SessionContext(上下文)中不存在,它显示anonymous而不是用户。

我的服务中可能缺少哪些想法?

2 个答案:

答案 0 :(得分:2)

在这种情况下,我的jboss-web.xml文件夹中缺少WEB-INF文件。

我添加了一个名为jboss-web.xml的文件,其中包含以下内容,并且像魅力一样工作。

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

答案 1 :(得分:0)

我也遇到了类似的问题,因为我的EJB不安全。必须使用@PermitAll或@RolesAllowed批注来保护EJB。没有这些注释之一,您可以从EjbContext检索的用户主体将是匿名的。