Wildfly 9 安全域不起作用
Wildfly 9 security domains won't work
我正在将一个大型 Web 应用程序从 jboss 作为 6 迁移到 Wildfly 9,并且在途中遇到了一些障碍。
其中之一是安全域。
standalone.xml
的相关部分如下:
<subsystem xmlns="urn:jboss:domain:security:1.2">
<security-domains>
<security-domain name="other" cache-type="default">
<authentication>
<login-module code="Remoting" flag="optional">
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
<login-module code="RealmDirect" flag="required">
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
</authentication>
</security-domain>
<security-domain name="jboss-web-policy" cache-type="default">
<authorization>
<policy-module code="Delegating" flag="required"/>
</authorization>
</security-domain>
<security-domain name="jboss-ejb-policy" cache-type="default">
<authorization>
<policy-module code="Delegating" flag="required"/>
</authorization>
</security-domain>
<security-domain name="mydomain" cache-type="default">
<authentication>
<login-module code="foo.token.LoginModule" flag="required">
<module-option name="hashAlgorithm" value="SHA-512"/>
<module-option name="hashEncoding" value="base64"/>
<module-option name="unauthenticatedIdentity" value="guest"/>
<module-option name="dsJndiName" value="jdbc/fooDS"/>
<module-option name="principalsQuery" value="select ..."/>
<module-option name="rolesQuery" value="select o.name, 'Roles' from roles up join ef_usuario ..."/>
</login-module>
</authentication>
</security-domain>
</security-domains>
</subsystem>
foo.token.LoginModule.java
是这样的:
@NoArgsConstructor
public class FooLoginModule extends DatabaseServerLoginModule {
private Principal principal;
private String userName;
@Override
public boolean login() throws LoginException {
super.loginOk = false;
super.loginOk = tryLogin();
return super.loginOk;
}
protected boolean tryLogin() throws LoginException {
if (doesSomeAdditionalLoginValidation()) {
createPrincipal();
return true;
}
return false;
}
@VisibleForTesting
protected UserResourceClient createUserResourceClient() {
return new UserResourceClient( createAuth(), createEndPoint() );
}
private EndPoint createEndPoint() {
return new EndPointProvider( ... ).create();
}
private Auth createAuth() {
return new AuthProvider( ... ).createAuth();
}
private void createPrincipal() throws LoginException {
try {
principal = createIdentity( userName );
} catch (Exception e) {
throw new LoginException( PROCESSING_FAILED + "Failed to create principal: " + e.getMessage() );
}
}
@Override
protected String getUsername() {
return userName;
}
@Override
protected Principal getIdentity() {
return principal;
}
}
该应用程序部署为 ear
,因此,在 .war
文件中我有一个 jboss-web.xml
,在 .jar
文件中我有一个 jboss-app.xml
. jboss-网络:
<jboss-web>
<security-domain>mydomain</security-domain>
</jboss-web>
jboss-应用程序:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-app>
<security-domain>mydomain</security-domain>
</jboss-app>
但是,当我尝试该应用程序尝试使用带有 @SecurityDomain("mydomain")
注释的 Stateless
bean 时,出现访问错误:
19:35:40,530 ERROR [org.jboss.as.ejb3.invocation] (default task-26)
WFLYEJB0034: EJB Invocation failed on component FooService for method
public java.lang.String foo.service.blah.FooService.find():
javax.ejb.EJBAccessException: WFLYEJB0364: Invocation on method:
public java.lang.String foo.service.blah.FooService.find() of bean:
FooService is not allowed
FooService 的代码如下:
@Stateless
@SecurityDomain("mydomain")
public class FooService {
public List<Foo> find() {
return ...;
}
}
我看到必须从所有地方删除前缀 java:/jaas/
,我也这样做了,但这仍然行不通。
在迁移指南中找不到与此相关的任何其他内容。
我错过了什么?
本质上,默认行为发生了变化。
在 JBoss AS 上,如果未指定角色,默认行为是 @PermitAll
,在 Wildfly 中,可由 default-missing-method-permissions-deny-access
配置,默认为 [=13] =].
我将 standalone.xml
更改为如下内容:
<subsystem xmlns="urn:jboss:domain:ejb3:3.0">
<!-- other stuff -->
<default-missing-method-permissions-deny-access value="false"/>
<!-- other stuff -->
</subsystem>
它和以前一样工作。
我正在将一个大型 Web 应用程序从 jboss 作为 6 迁移到 Wildfly 9,并且在途中遇到了一些障碍。
其中之一是安全域。
standalone.xml
的相关部分如下:
<subsystem xmlns="urn:jboss:domain:security:1.2">
<security-domains>
<security-domain name="other" cache-type="default">
<authentication>
<login-module code="Remoting" flag="optional">
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
<login-module code="RealmDirect" flag="required">
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
</authentication>
</security-domain>
<security-domain name="jboss-web-policy" cache-type="default">
<authorization>
<policy-module code="Delegating" flag="required"/>
</authorization>
</security-domain>
<security-domain name="jboss-ejb-policy" cache-type="default">
<authorization>
<policy-module code="Delegating" flag="required"/>
</authorization>
</security-domain>
<security-domain name="mydomain" cache-type="default">
<authentication>
<login-module code="foo.token.LoginModule" flag="required">
<module-option name="hashAlgorithm" value="SHA-512"/>
<module-option name="hashEncoding" value="base64"/>
<module-option name="unauthenticatedIdentity" value="guest"/>
<module-option name="dsJndiName" value="jdbc/fooDS"/>
<module-option name="principalsQuery" value="select ..."/>
<module-option name="rolesQuery" value="select o.name, 'Roles' from roles up join ef_usuario ..."/>
</login-module>
</authentication>
</security-domain>
</security-domains>
</subsystem>
foo.token.LoginModule.java
是这样的:
@NoArgsConstructor
public class FooLoginModule extends DatabaseServerLoginModule {
private Principal principal;
private String userName;
@Override
public boolean login() throws LoginException {
super.loginOk = false;
super.loginOk = tryLogin();
return super.loginOk;
}
protected boolean tryLogin() throws LoginException {
if (doesSomeAdditionalLoginValidation()) {
createPrincipal();
return true;
}
return false;
}
@VisibleForTesting
protected UserResourceClient createUserResourceClient() {
return new UserResourceClient( createAuth(), createEndPoint() );
}
private EndPoint createEndPoint() {
return new EndPointProvider( ... ).create();
}
private Auth createAuth() {
return new AuthProvider( ... ).createAuth();
}
private void createPrincipal() throws LoginException {
try {
principal = createIdentity( userName );
} catch (Exception e) {
throw new LoginException( PROCESSING_FAILED + "Failed to create principal: " + e.getMessage() );
}
}
@Override
protected String getUsername() {
return userName;
}
@Override
protected Principal getIdentity() {
return principal;
}
}
该应用程序部署为 ear
,因此,在 .war
文件中我有一个 jboss-web.xml
,在 .jar
文件中我有一个 jboss-app.xml
. jboss-网络:
<jboss-web>
<security-domain>mydomain</security-domain>
</jboss-web>
jboss-应用程序:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-app>
<security-domain>mydomain</security-domain>
</jboss-app>
但是,当我尝试该应用程序尝试使用带有 @SecurityDomain("mydomain")
注释的 Stateless
bean 时,出现访问错误:
19:35:40,530 ERROR [org.jboss.as.ejb3.invocation] (default task-26) WFLYEJB0034: EJB Invocation failed on component FooService for method public java.lang.String foo.service.blah.FooService.find(): javax.ejb.EJBAccessException: WFLYEJB0364: Invocation on method: public java.lang.String foo.service.blah.FooService.find() of bean: FooService is not allowed
FooService 的代码如下:
@Stateless
@SecurityDomain("mydomain")
public class FooService {
public List<Foo> find() {
return ...;
}
}
我看到必须从所有地方删除前缀 java:/jaas/
,我也这样做了,但这仍然行不通。
在迁移指南中找不到与此相关的任何其他内容。
我错过了什么?
本质上,默认行为发生了变化。
在 JBoss AS 上,如果未指定角色,默认行为是 @PermitAll
,在 Wildfly 中,可由 default-missing-method-permissions-deny-access
配置,默认为 [=13] =].
我将 standalone.xml
更改为如下内容:
<subsystem xmlns="urn:jboss:domain:ejb3:3.0">
<!-- other stuff -->
<default-missing-method-permissions-deny-access value="false"/>
<!-- other stuff -->
</subsystem>
它和以前一样工作。