【问题标题】:Configuring security to access EJB through WS -- WFLYEJB0364 Connection rejected配置安全性以通过 WS 访问 EJB -- WFLYEJB0364 连接被拒绝
【发布时间】: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 与不同名称的安全域一起工作。

标签: wildfly elytron


【解决方案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)
{"结果" => "成功"}

注意事项:

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

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

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

【讨论】:

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