Я переношу большое веб-приложение от jboss как 6 к wildfly 9 и столкнулся с несколькими препятствиями на пути.Домены безопасности 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
файлов у меня есть a 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 Invocation на компоненте FooService для метода 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() из bean: FooService не допускается
код The FooService выглядит так:
@Stateless
@SecurityDomain("mydomain")
public class FooService {
public List<Foo> find() {
return ...;
}
}
Я вижу, что префикс java:/jaas/
должен быть удален отовсюду, и я сделал это, но все равно это не будет работать.
Невозможно найти другую вещь, которая, по-видимому, связана с руководством по миграции.
Что мне не хватает?