Wildfly 9安全域无法正常工作

时间:2016-05-24 22:39:48

标签: jboss wildfly wildfly-9 securitydomain

我正在将一个大型网页应用程序从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>

但是,当我尝试使用注释为Stateless的{​​{1}} bean时,我会遇到访问错误:

  

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

FooService的代码如下:

@SecurityDomain("mydomain")

我看到必须从任何地方删除前缀@Stateless @SecurityDomain("mydomain") public class FooService { public List<Foo> find() { return ...; } } ,我这样做了,但仍然无法正常工作。

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

我错过了什么?

1 个答案:

答案 0 :(得分:0)

本质上,默认行为会发生变化。

在JBoss AS上,如果没有指定角色,则默认行为是@PermitAll,在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>

它和以前一样有效。