0

我正在将一个大型网络应用程序从 jboss as 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.xmljboss-网络:

<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>

但是,当我尝试应用程序尝试使用带有Stateless注释的 bean 时@SecurityDomain("mydomain"),我会遇到访问错误:

19:35:40,530 错误 [org.jboss.as.ejb3.invocation](默认任务 26)WFLYEJB0034:方法公共 java.lang.String foo.service.blah.FooService.find() 的组件 FooService 上的 EJB 调用失败:javax.ejb.EJBAccessException:WFLYEJB0364:调用方法:公共java.lang.String foo.service.blah.FooService.find()的bean:FooService是不允许的

FooService 的代码如下所示:

@Stateless
@SecurityDomain("mydomain")
public class FooService {

    public List<Foo> find() {
        return ...;
    }
}

我看到java:/jaas/必须从任何地方删除前缀,我做到了,但这仍然行不通。

在迁移指南中找不到与此相关的任何其他内容。

我错过了什么?

4

1 回答 1

1

从本质上讲,默认行为发生了变化。

在 JBoss AS 上,@PermitAll如果没有指定角色,默认行为是 to,在 Wildfly 中,它可以通过 配置default-missing-method-permissions-deny-access,并且默认为@DenyAll

我将我的更改standalone.xml为这样的:

<subsystem xmlns="urn:jboss:domain:ejb3:3.0">
    <!-- other stuff -->
    <default-missing-method-permissions-deny-access value="false"/>
    <!-- other stuff -->
</subsystem>

它像以前一样工作。

于 2016-05-25T17:08:44.573 回答