Домены безопасности Wildfly 9 не будут работать

Я перевожу большое веб-приложение с 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 боб с аннотацией @SecurityDomain("mydomain")Я получаю ошибки доступа:

19: 35: 40,530 ОШИБКА [org.jboss.as.ejb3.invocation] (задание по умолчанию-26) WFLYEJB0034: сбой при вызове EJB для компонента FooService для метода public java.lang.String foo.service.blah.FooService.find(): javax.ejb.EJBAccessException: WFLYEJB0364: вызов метода: public java.lang.String foo.service.blah.FooService.find() компонента: FooService не разрешен

Код FooService выглядит так:

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

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

Я вижу, что префикс java:/jaas/ должен быть удален отовсюду, и я сделал это, но все равно это не сработает.

Не могу найти ничего другого, что кажется связанным с этим в руководствах по миграции.

Что мне не хватает?

1 ответ

Решение

По сути, поведение по умолчанию меняется.

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

И это сработало как раньше.

Другие вопросы по тегам