我已经按照本教程为用户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用户,相对于=jboss.server.config.dir)
{"result"=>"success"}[standalone@localhost:9990/]/subsystem=elytron/filesystem realm=proxyRealm:添加标识(identity=ejbuser)
{"result"=>"success"}[standalone@localhost:9990/]/subsystem=elytron/filesystem realm=proxyRealm:设置密码(identity=ejbuser,clear={password=1234678})
{"result"=>"success"}[standalone@localhost:9990/]/subsystem=elytron/filesystem realm=proxyRealm:添加身份属性(identity=ejbuser,name=Roles,value=["guest","appCitas"])
{"output=">"success"}[standalone@localhost:9990/]/subsystem=elytron/简单角色解码器=来自角色属性:add(attribute=roles)
{"result"=>"success"}[standalone@localhost:9990/]/subsystem=elytron/security domain=proxySD:add(默认领域=proxyRealm,权限映射器=默认权限映射器,领域=[{领域=proxyRealm,角色解码器=来自角色属性},{领域=本地}])
{"result"=>"success"}[standalone@localhost:9990/]/subsystem=elytron/sasl身份验证工厂=代理应用程序sasl身份验证:add(机制配置=[{机制名称=JBOSS-LOCAL-USER,领域映射器=本地},{机制名=DIGEST-MD5,机制领域配置=[{领域名称=proxyRealm}]},{机制名=BASIC,机制领域设置=[{领域名称=代理realm}]}],sasl服务器工厂=已配置,安全域=proxySD)
{"结果"=>"成功"}[standalone@localhost:9990/]/subsystem=ejb3/application security domain=other:add(security domain=proxySD)
{"result"=>"success"}[standalone@localhost:9990/]/subsystem=远程处理/http connector=http远程处理connector:write属性(name=sasl身份验证工厂,value=代理应用程序sasl授权)
{"结果"=>"成功","响应标头"=>{"操作需要重新加载"=>true,"进程状态"=>"需要重新加载"}}
在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
- 域:我尝试过其他,proxySD,proxyRealm,并将其留空
- 先发制人的身份验证:我已经将"域"的所有上述值与"使用全局首选项"one_answers"以先发制人的方式进行身份验证"相结合
在所有情况下,我都会得到
<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决赛。
注意:这个问题与我之前的问题有一定的关系,但由于我已经重新安装了wildfly,并且我已经一步一步地遵循了上面提到的教程,我认为最好将其作为一个单独的问题发布。
更新
按照@fjuma的回答,我配置了以下内容:
[standalone@localhost:9990/]/subsystem=elytron/http authentication factory=代理应用程序http authentication:add(http服务器机制工厂=全局,安全域=proxySD,机制配置=[{机制名称=BASIC,mechanims领域配置=[{领域名称=proxyAD}]}])
{"result"=>"success"}[standalone@localhost:9990/]/subsystem=undertow/application security domain=proxyAD:add(http身份验证工厂=代理应用程序http身份验证)
{"result"=>"success"}
将jboss-app.xml
中的security-domain
的值更改为proxyAD
,我在部署ear时出错:
"WFLYCTL0412:未安装的必需服务:"=>["jboss.security.securitydomain.proxyAD"],
"WFLYCTL 180:具有丢失/不可用依赖项的服务"=>[
"jboss.deployment.asubject.\"prototipoEarCits-0.0.1-SNAPSHOT.ear\".\"PrototipoEjbCits-0.00.1-SNAPSHOT.jar\"component.ApiCitsPublicImpl.REATE丢失[jboss.seecurity.securitydomain.proxy.AD]",
"jboss.ws.endpoint.\"prototipoEarCits-0.0.1-SNAPSHOT.ear\".\"PrototipoEjbCits-0.01-SNAPSHOT.jar\".ApiCitsPublicImpl丢失[jboss.security.securitydomain.proxyAD]">
]
}
需要注意的几件事:
-
要使用HTTP基本身份验证,需要一个Elytron
http-authentication-factory
。有关如何配置的文档可以在此处找到。 -
当使用HTTP基本身份验证时,还需要在Undertow子系统中添加
application-security-domain
映射。看见https://developer.jboss.org/thread/276445有关使用Web服务时与此相关的更多详细信息。
###由OP更新:这是通过WS配置EJB访问的最后一组最小命令(在全新的Wildfly 14.0.1上进行了测试)。最终):
C:\wildfly-14.0.1.Final\bin>jboss-cli.bat
您现在已断开连接。键入"connect"连接到服务器或有关支持的命令列表的帮助
[断开连接/]连接[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(领域=[{领域=代理领域,角色解码器=角色组}],默认领域=代理范围,权限映射器=默认权限映射器)
{结果=成功[standalone@localhost:9990/]/subsystem=elytron/http authentication factory=proxy http auth:add(http服务器机制工厂=全局,安全域=proxySD,机制配置=[{机制名称=BASIC,机制领域配置=[{领域名称=proxyRealm}]}]
{"结果">[standalone@localhost:9990/]/subsystem=understream/application security domain=proxySD:add(http身份验证工厂=proxy http auth)
{"output"=>"成功[standalone@localhost:9990/]/subsystem=elytron/sasl身份验证工厂=代理应用程序sasl-auth:add(机制配置=[{机制名称=JBOSS-LOCAL-USER,领域映射程序=本地},{机制名=BASIC,机制领域配置=[{领域名称=proxyRealm}]}],sasl服务器工厂=已配置,安全域=proxySD)
[standalone@localhost:9990/]/子系统=ejb3/应用程序安全域=proxySD:add(安全域=proxySD)
{"结果"="成功"}
备注:
您可能已经注意到,我从文件系统领域切换到了属性领域。这与问题无关,只是它使调试变得更容易。
Elytron的安全域(在第3个命令中定义)、Undertow的应用程序安全域(第4个命令中指定)和EJB的应用程序安全域(第6个命令中确定)都具有相同的名称
proxySD
。的名称在所有三个子系统中都是相同的,这一点很重要,如果它们有不同的名称,可能会发生不好的事情(我还没有尝试所有的组合)。基于EJB的WS必须用";"预先认证";,在所述第一请求中发送所述认证数据,而不由所述服务器提示。战争中基于POJO的WS使用网页的身份验证系统,因此不需要预先进行身份验证。