配置安全性以通过 WS 访问 EJB -- WFLYEJB0364 连接被拒绝

Posted

技术标签:

【中文标题】配置安全性以通过 WS 访问 EJB -- WFLYEJB0364 连接被拒绝【英文标题】:Configuring security to access EJB through WS -- WFLYEJB0364 Connection rejected 【发布时间】:2019-06-04 10:07:45 【问题描述】:

我已关注this tutorial 配置用户ejbuser,密码12345678 和角色appCitas。我遵循的说明是:

C:\wildfly-14.0.1.Final\bin>jboss-cli.bat 您此时已断开连接。键入“connect”以连接到服务器,或键入“help”以获取支持的命令列表。 [断开/]连接

[standalone@localhost:9990 /] /subsystem=elytron/filesystem-realm=proxyRealm:add(path=proxy-realm-users,relative-to=jboss.server.config.dir) "结果" => "成功"

[standalone@localhost:9990 /] /subsystem=elytron/filesystem-realm=proxyRealm:add-identity(identity=ejbuser) "结果" => "成功"

[standalone@localhost:9990 /] /subsystem=elytron/filesystem-realm=proxyRealm:set-password(identity=ejbuser,clear=password=12345678) "结果" => "成功"

[standalone@localhost:9990 /] /subsystem=elytron/filesystem-realm=proxyRealm:add-identity-attribute(identity=ejbuser,name=Roles,value=["guest", "appCitas"]) "结果" => "成功"

[standalone@localhost:9990 /] /subsystem=elytron/simple-role-decoder=from-roles-attribute:add(attribute=Roles) "结果" => "成功"

[standalone@localhost:9990 /] /subsystem=elytron/security-domain=proxySD:add(default-realm=proxyRealm,permission-mapper=default-permission-mapper,realms=[realm=proxyRealm,role-解码器=from-roles-attribute,realm=local]) "结果" => "成功"

[standalone@localhost:9990 /] /subsystem=elytron/sasl-authentication-factory=proxy-application-sasl-autentication:add(mechanism-configurations=[mechanism-name=JBOSS-LOCAL-USER,realm- mapper=local,mechanism-realm-configurations=[realm-name=proxyRealm],mechanism-name=BASIC,mechanism-realm-configurations=[realm-name= proxyRealm]],sasl-server-factory=configured,security-domain=proxySD) "结果" => "成功"

[standalone@localhost:9990 /] /subsystem=ejb3/application-security-domain=other:add(security-domain=proxySD) "结果" => "成功"

[standalone@localhost:9990 /] /subsystem=remoting/http-connector=http-remoting-connector:write-attribute(name=sasl-authentication-factory,value=proxy-application-sasl-autentication) “结果” => “成功”, “响应标题” => “操作需要重新加载”=> 真, “进程状态” => “需要重新加载”

在 mi EJB 中,我有

@WebService(
  endpointInterface = "es.ssib.otic.test.prototipoEjbCitas.ApiCitasPublico",
  name = "ApiCitasEjb")
@RolesAllowed("apiCitas")
@Stateless
public class ApiCitasPublicoImpl
    implements ApiCitasPublico 

    @Override
    public @XmlElement(name = "pacienteCitaResponse", required = true) PacienteCitaResponse getPacienteCita(
        @WebParam(name = "datosSolicitante") @XmlElement(required = true) IdPeticion idPaciente) 
   ...

我的jboss-app.xml

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

ear 部署正确并且没有显示任何日志问题,但我尝试从 SoapUI 访问一个方法并添加一个基本身份验证,其中:

用户名:ejbuser 密码:12345678 域:我尝试过使用其他代理SD、proxyRealm 并将其留空 抢先式身份验证:我已将“域”的所有上述值与“使用全局首选项”和“抢先式身份验证”相结合。

在所有情况下,我都会得到一个

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <soap:Fault>
       <faultcode>soap:Server</faultcode>
       <faultstring>WFLYEJB0364: Invocation on method: public es.ssib.otic.test.prototipoEjbCitas.beans.PacienteCitaResponse es.ssib.otic.test.prototipoEjbCitas.impl.ApiCitasPublicoImpl.getPacienteCita(es.ssib.otic.test.prototipoEjbCitas.beans.IdPeticion) of bean: ApiCitasPublicoImpl is not allowed</faultstring>
    </soap:Fault>
  </soap:Body>
</soap:Envelope>

如果我删除安全配置,我可以毫无问题地通过 SoapUI 访问。

使用 WildFly 14.0.0.1 Final。

注意:这个问题与my previous one有些关系,但是由于我已经重新安装了wildfly,并且我已经按照上面提到的教程一步一步地进行了操作,所以我认为最好将它作为一个单独的问题发布。


更新

按照@fjuma 的回答,我配置了以下内容:

[standalone@localhost:9990 /] /subsystem=elytron/http-authentication-factory=proxy-application-http-authentication:add(http-server-mechanism-factory=global,security-domain=proxySD,mechanism-配置=[机制名称=BASIC,机制领域配置=[领域名称=proxyAD]]) "结果" => "成功"

[standalone@localhost:9990 /] /subsystem=undertow/application-security-domain=proxyAD:add(http-authentication-factory=proxy-application-http-authentication) "结果" => "成功"

并将jboss-app.xml中的security-domain的值更改为proxyAD,部署耳朵时出现错误:

"WFLYCTL0412: 未安装的必需服务:" => ["jboss.security.security-domain.proxyAD"], “WFLYCTL0180:缺少/不可用依赖项的服务”=> [ "jboss.deployment.subunit.\"prototipoEarCitas-0.0.1-SNAPSHOT.ear\".\"prototipoEjbCitas-0.0.1-SNAPSHOT.jar\".component.ApiCitasPublicoImpl.CREATE 丢失 [jboss.security.security-domain .proxyAD]", "jboss.ws.endpoint.\"prototipoEarCitas-0.0.1-SNAPSHOT.ear\".\"prototipoEjbCitas-0.0.1-SNAPSHOT.jar\".ApiCitasPublicoImpl 丢失 [jboss.security.security-domain.proxyAD]" ]

【问题讨论】:

您能否解决上一个问题WFLYCTL0412?在正确配置 elytron/undertow/ejb 安全域后,我看到了同样的错误。如果我删除 @WebService 注释,它会起作用。类作为普通 EJB 加载,但我一添加 @WebService 注释就会看到 WFLYCTL0412 在看到您对命名 3 个具有相同名称的安全域的评论后,我尝试了它,它现在可以工作了。奇怪的是它只需要@WebService,普通的 EJB 和 Servlet 与不同名称的安全域一起工作。 【参考方案1】:

需要注意的几点:

要使用 HTTP 基本身份验证,需要 Elytron http-authentication-factory。关于如何配置的文档可以在here找到。

使用 HTTP Basic 身份验证时,还需要在 Undertow 子系统中添加 application-security-domain 映射。使用 Web 服务时,请参阅 https://developer.jboss.org/thread/276445 了解与此相关的更多详细信息。


###由 OP 更新:

这是通过 WS 配置 EJB 访问的最终最小命令集(在干净、全新的 Wildfly 14.0.1 上测试。最终版本):

C:\wildfly-14.0.1.Final\bin>jboss-cli.bat 您此时已断开连接。键入“connect”以连接到服务器或“ help' 获取支持的命令列表。 [断开/]连接

[standalone@localhost:9990 /] /subsystem=elytron/properties-realm=proxyRealm:add(groups-attribute=groups,groups-properties=path=proxy-roles.properties,relative-to=jboss.server .config.dir,users-properties=path=proxy-users.properties,relative-to=jboss.server.config.dir,plain-text=true) "结果" => "成功"

[standalone@localhost:9990 /] /subsystem=elytron/security-domain=proxySD:add(realms=[realm=proxyRealm,role-decoder=groups-to-roles],default-realm=proxyRealm,权限映射器=默认权限映射器) "结果" => "成功"

[standalone@localhost:9990 /] /subsystem=elytron/http-authentication-factory=proxy-http-auth:add(http-server-mechanism-factory=global,security-domain=proxySD,mechanism-configurations= [mechanism-name=BASIC,mechanism-realm-configurations=[realm-name=proxyRealm]] "结果" => "成功"

[standalone@localhost:9990 /] /subsystem=undertow/application-security-domain=proxySD:add(http-authentication-factory=proxy-http-auth) "结果" => "成功"

[standalone@localhost:9990 /] /subsystem=elytron/sasl-authentication-factory=proxy-app-sasl-auth:add(mechanism-configurations=[mechanism-name=JBOSS-LOCAL-USER,realm- mapper=local,mechanism-name=BASIC,mechanism-realm-configurations=[realm-name=proxyRealm]],sasl-server-factory=configured,security-domain=proxySD) "结果" => "成功"

[standalone@localhost:9990 /] /subsystem=ejb3/application-security-domain=proxySD:add(security-domain=proxySD) "结果" => "成功"

注意事项:

    您可能已经注意到,我从 FileSystem 领域切换到了 Properties 领域。这与问题无关,只是它更容易调试。

    Elytron 的安全域(在第 3 条命令中定义)、Undertow 的应用程序安全域(在第 4 条命令中定义)和 EJB 的应用程序安全域(在第 6 条命令中定义)都具有相同的名称 proxySD三个子系统中的名称相同很重要,如果它们有不同的名称,可能会发生不好的事情(我还没有尝试过所有的组合)。

    基于 EJB 的 WS 必须使用“authenticate preemptively”调用,在第一个请求中发送身份验证数据而无需服务器提示。战争中基于POJO的WS使用的是网页认证系统,所以不需要抢先认证。

【讨论】:

感谢您的帮助。我已根据您的链接添加了一些步骤,但它不起作用(我已将详细信息添加为我的问题的更新,因为它们有点长)。看来jboss-app.xml中定义的域一定是Elytron域,而不是Undertow那个。 我终于明白了,抱歉让我久等了,但我也遇到了一个问题,即 POJO 接受“正常”基本身份验证(仅在服务器请求时发送身份验证信息)vs如果您不抢先发送身份验证信息,则带有 EJB 的 WS 会失败。我将使用我最终用完的完整命令集来调整您的答案,因为 SO 不鼓励仅链接的答案。

以上是关于配置安全性以通过 WS 访问 EJB -- WFLYEJB0364 连接被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 WebSocket 服务器以接受安全连接请求

MyEclipse WebSphere开发教程:安装和更新WebSphere 6.1, JAX-WS, EJB 3.0

MyEclipse WebSphere开发教程:安装和更新WebSphere 6.1, JAX-WS, EJB 3.0

MyEclipse WebSphere开发教程:安装和更新WebSphere 6.1, JAX-WS, EJB 3.0

WS-* 协议

springboot集成webservice接口