Il progetto utilizza un approccio basato su tag JUnit per garantire la copertura completa dei requisiti di sicurezza.
Definiamo i gruppi di test con cui vogliamo classificare i nostri test:
| Tag | Descrizione | Status Code atteso |
|---|---|---|
authorized |
Test per accessi autorizzati | 200, 201 |
unauthorized |
Test per utenti non autenticati (JWT mancante o non valido) | 401 |
forbidden |
Test per utenti autenticati senza i permessi necessari | 403 |
security |
Tag generico per qualsiasi altro controllo di sicurezza | vari |
Ecco un esempio di test con tag forbidden:
@Test
@Tag("security")
@Tag("forbidden")
void testMarkdown403NoAdminRole() {
String token = JwtGenerator.generateUserToken();
given()
.header("Authorization", "Bearer " + token)
.when().get("/doc/example.adoc")
.then().statusCode(Response.Status.FORBIDDEN.getStatusCode());
}
Ci sono vari modi per verificare la presenza di test sui tag definiti.
Per questa demo usiamo il più semplice, ovvero andremo a verificare con il maven-surefire-plugin che sia presente almeno un test per ogni tag.
Questo può essere fatto con una execution del plugin per ogni tag, es:
<execution>
<id>verify-security-tests</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<groups>security</groups>
<failIfNoTests>true</failIfNoTests>
</configuration>
</execution>
Nel nostro caso attiviamo questo controllo con il profilo security:
mvn verify -P security
Nota: È possibile usare questo meccanismo per verificare anche altri tag custom definiti dallo sviluppatore.
Un effetto collaterale dell’utilizzo del profilo security è che vengono eseguiti solo i test con i tag definiti.
Nella nostra CI per ovviare a questa situazione, abbiamo separato lo step di verifica da quello per il calcolo del quality gate e coverage:
- name: Check security unit test tags
run: mvn verify -P security
- name: Build and analyze
env:
SONAR_TOKEN: $
run: mvn -B clean install org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.organization=fugerit79 -Dsonar.projectKey=fugerit79_lab-broken-access-control-quarkus
Nota: In futuro potremmo rendere più robusto il meccanismo, ad esempio con un sistema più personalizzabile di verifica (es. custom maven plugin).