Foundational Architecture
webforJ -turvajärjestelmä perustuu ydinliittymien perusrakenteeseen, joka toimii yhdessä tarjotakseen reittikohtaista pääsynvalvontaa. Nämä liittymät määrittelevät turvallisuuskäyttäytymiseen liittyvät sopimukset, jolloin erilaiset toteutukset, olivatpa ne istuntopohjaisia, JSON Web Tokeneihin (JWT) perustuvia, LDAP-integroituja tai tietokantapohjaisia, voivat liittää samaan perustavaan kehykseen.
Tämän arkkitehtuurin ymmärtäminen auttaa sinua näkemään, miten turvallisuusannotaatioita, kuten @RolesAllowed ja @PermitAll, arvioidaan, miten navigoinnin keskeyttäminen toimii, ja miten voit rakentaa mukautettuja turvallisuustoteutuksia erityistarpeitasi varten.
Ydinliittymät
Turvallisuuden perusta rakentuu tärkeiden abstrahointien varaan, joilla jokaisella on erityinen vastuu:
RouteSecurityManager
RouteSecurityManager on turvallisuusjärjestelmän keskeinen koordinaattori. Se hallinnoi turvallisuusarvioijia, koordinoi arviointiprosessia ja käsittelee pääsyn kieltoja ohjaamalla käyttäjiä asianmukaisille sivuille.
Vastuut:
- Rekisteröi ja hallinnoi turvallisuusarvioijia prioriteeteilla
- Koordinoi arviointiprosessia, kun käyttäjä navigoi reitille
- Käsittelee pääsyn kieltoja käynnistämällä uudelleenohjaukset kirjautumis- tai pääsykieltosivuille
- Tallentaa ja palauttaa ennakkovalmistellen paikkoja kirjautumisen jälkeisiin uudelleenohjauksiin
public interface RouteSecurityManager {
RouteAccessDecision evaluate(Class<?> routeClass, NavigationContext context);
void onAccessDenied(RouteAccessDecision decision, NavigationContext context);
RouteSecurityContext getSecurityContext();
RouteSecurityConfiguration getConfiguration();
void registerEvaluator(RouteSecurityEvaluator evaluator, int priority);
Optional<Location> consumePreAuthenticationLocation();
}
Johtaja ei tee turvallisuuspäätöksiä itse, vaan delegoi arvioijille ja määrityksille. Se on liima, joka yhdistää kaikki turvallisuuskomponentit.
RouteSecurityContext
RouteSecurityContext tarjoaa pääsyn nykyisen käyttäjän todennus-tilaan. Se vastaa kysymyksiin, kuten onko käyttäjä todennettu, mikä heidän käyttäjänimensä on, ja onko heillä ADMIN-rooli.
Vastuut:
- Määritä, onko nykyinen käyttäjä todennettu
- Tarjoa käyttäjän perimmäinen (tyypillisesti heidän käyttäjänimensä tai käyttäjäobjekti)
- Tarkista, onko käyttäjällä erityisiä rooleja tai valtuuksia
- Tallentaa ja palauttaa mukautettuja turvallisuusattribuutteja
public interface RouteSecurityContext {
boolean isAuthenticated();
Optional<Object> getPrincipal();
boolean hasRole(String role);
boolean hasAuthority(String authority);
Optional<Object> getAttribute(String name);
void setAttribute(String name, Object value);
}
Toteutukset vaihtelevat riippuen todennusjärjestelmästä, HTTP-istuntotallennuksesta, päähakemistoista dekoodatuista JWT-tokenista, tietokantakyselyistä, LDAP-hauista tai muista mekanismeista.
RouteSecurityConfiguration
RouteSecurityConfiguration määrittelee turvallisuuskäyttäytymisen ja uudelleenohjauspaikat. Se kertoo turvallisuusjärjestelmälle, minne käyttäjät lähetetään, kun todennusta vaaditaan tai pääsy on kielletty.
Vastuut:
- Määritä, onko turvallisuus käytössä
- Määritä oletusarvoinen käyttäytyminen turvallisena
- Tarjoa todennus-sivun sijainti (tyypillisesti
/login) - Tarjoa pääsykielto-sivun sijainti
public interface RouteSecurityConfiguration {
default boolean isEnabled() { return true; }
default boolean isSecureByDefault() { return true; }
default Optional<Location> getAuthenticationLocation() {
return Optional.of(new Location("/login"));
}
default Optional<Location> getDenyLocation() { /* ... */ }
}
Tämä liittymä erottaa turvallisuuspolitiikan turvallisuuden täytäntöönpanosta. Voit muuttaa uudelleenohjauspaikkoja tai kytkeä turvallisena oletusarvon ilman, että sinun tarvitsee muuttaa johtajaa tai arvioijia.
RouteSecurityEvaluator
RouteSecurityEvaluator on paikka, jossa varsinaiset turvallisuus säännöt tarkistetaan. Jokainen arvioija tarkastelee reittiä ja päättää, myönnetäänkö pääsy, evätäänkö pääsy vai delegoidaanko päätös seuraavalle arvioijalle ketjussa.
Vastuut:
- Määritä, käsittääkö tämä arvioija annetun reitin
- Arvioi turvallisuusannotaatioita reittiluokassa
- Myönnä pääsy, evä pääsy tai delegoi seuraavalle arvioijalle
- Osallistu vastuuketjun malliin
public interface RouteSecurityEvaluator {
RouteAccessDecision evaluate(Class<?> routeClass,
NavigationContext context,
RouteSecurityContext securityContext,
SecurityEvaluatorChain chain);
default boolean supports(Class<?> routeClass) { return true; }
}
Sisäänrakennetut arvioijat käsittelevät standardiannotaatioita, kuten @RolesAllowed, @PermitAll, @DenyAll ja @AnonymousAccess. Voit luoda mukautettuja arvioijia toteuttaaksesi erityisesti tietyn alan turvallisuuslogiikkaa.
Kuinka liittymät toimivat yhdessä
Nämä neljä liittymää tekevät yhteistyötä navigoinnin aikana turvallisuussääntöjen täytäntöönpanemiseksi:
Kun käyttäjä navigoi, RouteSecurityObserver keskeyttää navigoinnin ja pyytää RouteSecurityManager-toteutusta arvioimaan pääsyn. Johtaja konsultoi RouteSecurityConfiguration-toteutusta asetusten osalta, saa käyttäjtiedot RouteSecurityContext-toteutuksesta ja suorittaa jokaisen RouteSecurityEvaluator-toteutuksen prioriteetti-järjestyksessä, kunnes joku tekee päätöksen.
Liittymät sopimuksina
Jokainen liittymä määrittelee sopimuksen, joukon kysymyksiä, joihin turvallisuusjärjestelmän tarvitaan vastauksia. Miten vastaat näihin kysymyksiin on sinun toteutuksesi valinta:
RouteSecurityContext sopimus:
- "Onko nykyinen käyttäjä todennettu?" (
isAuthenticated()) - "Kuka on käyttäjä?" (
getPrincipal()) - "Onko käyttäjällä rooli X?" (
hasRole())
Päätät, mistä tämä tieto tulee: HTTP-istunnoista, päähakemistoista dekoodatuista JWT-tokenista, tietokantahauista, LDAP-hauista tai mistä tahansa muusta todennus taustasta.
RouteSecurityConfiguration sopimus:
- "Onko turvallisuus käytössä?" (
isEnabled()) - "Pitäisikö reittien olla oletusarvoisesti turvallisia?" (
isSecureByDefault()) - "Mihin todennetut käyttäjät pitäisi ohjata?" (
getAuthenticationLocation())
Päätät, miten nämä arvot saadaan: kovakoodattuina, konfiguraatiotiedostoista, ympäristömuuttujista, tietokannasta tai lasketaan dynaamisesti.
RouteSecurityManager sopimus:
- "Pitäisikö tälle käyttäjälle myöntää pääsy tälle reitille?" (
evaluate()) - "Mitä tapahtuu, kun pääsy evätään?" (
onAccessDenied()) - "Mitä arvioijia pitäisi suorittaa?" (
registerEvaluator())
Päätät todennusprosessin, minne tallennetaan ennakkovalmistellut sijainnit ja miten käsitellään mukautettuja kieltoskenaarioita.
Perusta-arkkitehtuuri määrittelee nämä sopimukset, mutta toteutus on joustavaa. Eri järjestelmät voivat toteuttaa nämä liittymät täysin eri tavoilla erityisten vaatimusten mukaan.
AbstractRouteSecurityManager perusluokka
Useimmat toteutukset eivät toteuta RouteSecurityManager-liittymää suoraan. Sen sijaan ne laajentavat AbstractRouteSecurityManager-luokkaa, joka tarjoaa:
- Arvioijien rekisteröintiä ja prioriteetti-pohjaista lajittelua
- Ketjun suorituslogiikkaa
- Pääsyn kieltojen käsittely automaattisilla uudelleenohjauksilla
- Ennakkovalmistellen sijaintien tallennus HTTP-istuntoon
- Turvallisena oletusarvoisen käyttäytymisen varayhteys
Perusluokka toteuttaa RouteSecurityManager-liittymän ja tarjoaa konkreettisia toteutuksia arvioijien hallinnasta, pääsyn arvioinnista ja kieltojen käsittelyistä. Aliluokkien tarvitsee vain tarjota turvallisuuskonteksti ja -määritykset. Perusluokka käsittelee arvioijien hallintaa, ketjun suorittamista ja kieltojen käsittelyä automaattisesti.