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>

它和以前一样工作。