Customizing modules before starting
Sometimes it might be useful to modify certain semantics of a module.
For example:
-
You might want to inject extra configuration classes into another module.
-
You might want to expose some extra classes from another module.
On this page, you will:
-
Learn about
AcrossBootstrapConfigurer
to customize a module. -
Use
@ModuleConfiguration
to customize a module.
AcrossBootstrapConfigurer
To modify the Across context configuration or a bootstrapped module the AcrossBootstrapConfigurer
interface can be implemented.
across-autoconfigure:ROOT:chap-auto-configuration.adoc often implement this interface to inject the configurations into the relevant modules.
For the following example we will use the AdminWebModule
to enhance the standard security configuration.
First, add a dependency to admin-web-module
in your pom.xml.
<dependencies>
<dependency>
<groupId>com.foreach.across.modules</groupId>
<artifactId>admin-web-module</artifactId>
</dependency>
</dependencies>
Add AdminWebModule
to your application descriptor.
@AcrossApplication(
modules = {
AdminWebModule.NAME (1)
}
)
@Import(SecurityConfiguration.class) (2)
public class DemoApplication
{
public static void main( String[] args ) {
SpringApplication.run( DemoApplication.class, args );
}
}
1 | The AdminWebModule which provides login/logout functionality to a backend. |
2 | We import the configuration class which implements AcrossBootstrapConfigurer . |
@Configuration
public class SecurityConfiguration implements AcrossBootstrapConfigurer {
@Override
public void configureContext(AcrossBootstrapConfig contextConfiguration) {
contextConfiguration.extendModule(SpringSecurityModule.NAME, AuthenticationConfiguration.class); (1)
}
}
1 | The AuthenticationConfiguration class is injected into the SpringSecurityModule .
This module centralizes everything related to security. |
public class AuthenticationConfiguration
{
@Autowired
public void configureAuthentication( AuthenticationManagerBuilder auth ) throws Exception { (1)
auth.inMemoryAuthentication()
.withUser( "admin" ).password( "admin" )
.authorities( "access administration" ).and()
.withUser( "user" ).password( "user" )
.authorities( Collections.emptyList() );
}
}
1 | When Spring Security configures the AuthenticationManagerBuilder , the configuration will be extended with our implementation. |
Now run the application.
$ mvn spring-boot:run
When you navigate to http://localhost:8080/login in your browser you should be able to login with username admin and password admin.
Creating this structure is quite convoluted when only needing to inject a configuration into another module.
An easier alternative is to use @ModuleConfiguration
, explained in the next section.
Module extensions with @ModuleConfiguration
This specialised annotation acts like a @Configuration
class, but executes inside the scope of a specific module.
The above example can be rewritten to using just one configuration class.
First, add a dependency to admin-web-module
in your pom.xml.
<dependencies>
<dependency>
<groupId>com.foreach.across.modules</groupId>
<artifactId>admin-web-module</artifactId>
</dependency>
</dependencies>
Add AdminWebModule
to your application descriptor.
@AcrossApplication(
modules = {
AdminWebModule.NAME (1)
}
)
public class DemoApplication
{
public static void main( String[] args ) {
SpringApplication.run( DemoApplication.class, args );
}
}
Create an extensions
package under your application
package.
The extensions
package is automatically scanned by Across for @ModuleConfiguration
classes.
Add the following configuration class to the extensions
package.
@ModuleConfiguration(SpringSecurityModule.NAME) (1)
public class SecurityConfiguration {
@Autowired
public void configureAuthentication( AuthenticationManagerBuilder auth ) throws Exception { (2)
auth.inMemoryAuthentication()
.withUser( "admin" ).password( "admin" )
.authorities( "access administration" ).and()
.withUser( "user" ).password( "user" )
.authorities( Collections.emptyList() );
}
}
1 | This configuration class will be injected in the scope of the SpringSecurityModule .
If only @ModuleConfiguration is specified, it is injected in ALL modules. |
2 | The configuration will be customized when the AuthenticationManagerBuilder from the SpringSecurityModule is created. |
Only the extensions package is scanned for @ModuleConfiguration classes, if you place it anywhere else, it will be ignored.
|
Now run the application.
$ mvn spring-boot:run
When you navigate to http://localhost:8080/login in your browser you should be able to login with username admin and password admin.