Search code examples
isis

Apache Isis Security Module: Required table missing : "ISISSECURITY.APPLICATIONROLE"


I created an application using the apache isis simpleapp-archetype and then added the dependencies (isis-module-security-dom and jbcrypt) of the security module to my pom.xml's and the modules and services to my DomainAppAppManifest.

After running mvn clean install on the project the following error happens in the integration tests module:

[INFO] introspecting org.apache.isis.applib.services.iactn.Interaction: class-level details
[INFO] calling @PostConstruct on all domain services
seed-users-and-roles-fixture-script                         : EXEC   org.isisaddons.module.security.seed.SeedUsersAndRolesFixtureScript
seed-users-and-roles-fixture-script/global-tenancy          : EXEC org.isisaddons.module.security.seed.scripts.GlobalTenancy
[INFO] abort transaction IsisTransaction@517e381b[state=MUST_ABORT,commands=0]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Simple App ......................................... SUCCESS [  0.608 s]
[INFO] Simple App DOM ..................................... SUCCESS [ 14.607 s]
[INFO] Simple App Fixtures ................................ SUCCESS [  1.285 s]
[INFO] Simple App Application ............................. SUCCESS [  2.204 s]
[INFO] Simple App Integration Tests ....................... FAILURE [ 17.539 s]
[INFO] Simple App Webapp .................................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 36.654 s
[INFO] Finished at: 2016-09-26T18:44:48+07:00
[INFO] Final Memory: 65M/572M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.isis.tool:isis-maven-plugin:1.13.0:swagger (default) on project groupid-demo-integtests: Execution default of goal org.apache.isis.tool:isis-maven-plugin:1.13.0:swagger failed: org.datanucleus.store.rdbms.exceptions.MissingTableException: Required table missing : "ISISSECURITY.APPLICATIONROLE" in Catalog "" Schema "ISISSECURITY". DataNucleus requires this table to perform its persistence operations. Either your MetaData is incorrect, or you need to enable "datanucleus.schema.autoCreateTables"
-> [Help 1]

In principle I followed the documentation found in the security module github repository, but this didn't really work at all, and by taking a look at the quickstart module I figured the security dependencies needed to be added to the parent POM, and the the bcrypt dependency needs to be added to the App POM, and the security-plugin dependency to the Dom POM.

To reproduce the error, this is the what I did:

Create project with archetype

mvn archetype:generate -D archetypeGroupId=org.apache.isis.archetype -D archetypeArtifactId=simpleapp-archetype -D archetypeVersion=1.13.0 -D groupId=my.groupid -D artifactId=groupid-demo -D version=1.0-SNAPSHOT -D archetypeRepository=http://repository-estatio.forge.cloudbees.com/snapshot/ -B

Then in /groupid-demo/pom.xml I added these dependencies:

        <dependency>
            <groupId>org.isisaddons.module.security</groupId>
            <artifactId>isis-module-security-dom</artifactId>
            <version>1.13.1</version>
        </dependency>

        <dependency>
            <groupId>org.mindrot</groupId>
            <artifactId>jbcrypt</artifactId>
            <version>0.3m</version>
        </dependency>

In /groupid-demo-app/pom.xml I added this dependency:

    <dependency>
        <groupId>org.mindrot</groupId>
        <artifactId>jbcrypt</artifactId>
    </dependency>  

In /groupid-demo-app/src/main/java/domainapp/app/DomainAppAppManifest.java I modified the modules and services as follows:

@Override
public List<Class<?>> getModules() {
    return Arrays.asList(
            DomainAppDomainModule.class,  // domain (entities and repositories)
            DomainAppFixtureModule.class, // fixtures
            DomainAppAppModule.class      // home page service etc
            ,org.isisaddons.module.security.SecurityModule.class
    );
}

@Override
public List<Class<?>> getAdditionalServices() {
    return Arrays.asList(
            org.isisaddons.module.security.dom.password.PasswordEncryptionServiceUsingJBcrypt.class
    );
}

In /groupid-demo-dom/pom.xml I added this dependency:

    <dependency>
        <groupId>org.isisaddons.module.security</groupId>
        <artifactId>isis-module-security-dom</artifactId>
    </dependency>

And then /groupid-demo-webapp/src/main/webapp/WEB-INF/shiro.ini has been modified like this:

[main]

....

# to use .ini file
# securityManager.realms = $iniRealm

isisModuleSecurityRealm=org.isisaddons.module.security.shiro.IsisModuleSecurityRealm

authenticationStrategy=org.isisaddons.module.security.shiro.AuthenticationStrategyForIsisModuleSecurityRealm
securityManager.authenticator.authenticationStrategy = $authenticationStrategy

securityManager.realms = $isisModuleSecurityRealm

Finally I executed mvn clean install on the root pom and got above error.

Any idea what I am missing here? This is really just a bare bone simpleapp-archetype app with the only modification applied being the added security module.


Solution

  • Yes, I hit the same issue today when putting together this demo app for the issue you raised on the Apache Isis mailing list.

    The issue is that the maven plugin, which generates the swagger spec, uses its own AppManifest, and that manifest needs to correctly reference security.

    Since I didn't want to get side-tracked on this, I simply disabled the swagger goal in the pom.xml (remove the '!' exclamation mark).

    HTH Dan