Tavaszi biztonság: A JDBC-hitelesítés felfedezése

Kitartás felső

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

1. Áttekintés

Ebben a rövid bemutatóban megvizsgáljuk a Spring által kínált lehetőségeket a JDBC-hitelesítés végrehajtására egy meglévő segítségével Adatforrás konfiguráció.

A Hitelesítés egy adatbázis által támogatott UserDetailsService bejegyzésünkben az egyik megközelítést elemeztük ennek elérésére, a UserDetailService interfész magunkat.

Ezúttal felhasználjuk a AuthenticationManagerBuilder # jdbcAuthentication irányelv egyszerűbb megközelítés előnyeinek és hátrányainak elemzésére.

2. Beágyazott H2 kapcsolat használata

Először elemezzük, hogyan érhetjük el a hitelesítést egy beágyazott H2 adatbázis használatával.

Ezt könnyű elérni, mert a Spring Boot automatikus konfigurációjának készenléti előkészítése erre a forgatókönyvre készül.

2.1. Függőségek és adatbázis-konfiguráció

Kezdjük az előző Spring Boot With H2 Database bejegyzésünk utasításainak követésével:

  1. Tartalmazza a megfelelőt spring-boot-starter-data-jpa és h2 függőségek
  2. Konfigurálja az adatbázis-kapcsolatot az alkalmazás tulajdonságokkal
  3. Engedélyezze a H2 konzolt

2.2. A JDBC hitelesítés konfigurálása

Mi a Spring Security-t fogjuk használni AuthenticationManagerBuilder konfigurációs segítő a JDBC hitelesítés konfigurálásához:

@Autowired private DataSource dataSource; @Autowired public void configureGlobal (AuthenticationManagerBuilder auth) dobja a (z) {auth.jdbcAuthentication () .dataSource (dataSource) .withDefaultSchema () .withUser (User.withUsername ("user"). Jelszó (passwordEncoder ()) kivételt. ) .roles ("FELHASZNÁLÓ")); } @Bean public PasswordEncoder passwordEncoder () {return new BCryptPasswordEncoder (); }

Mint láthatjuk, az automatikus konfigurációt használjuk Adatforrás. A withDefaultSchema irányelv hozzáad egy adatbázis-szkriptet, amely feltölti az alapértelmezett sémát, lehetővé téve a felhasználók és a hatóságok tárolását.

Ezt az alapvető felhasználói sémát a Spring Security függelék dokumentálja.

Végül létrehozunk egy bejegyzést az adatbázisban, programozottan egy alapértelmezett felhasználóval.

2.3. A konfiguráció ellenőrzése

Hozzunk létre egy nagyon egyszerű végpontot a hitelesített adatok lekéréséhez információ:

@RestController @RequestMapping ("/ fő") public class UserController {@GetMapping public Principal retrievePrincipal (Principal megbízó) {return principál; }}

Ezenkívül meg fogjuk védeni ezt a végpontot, miközben engedélyezzük a H2 konzolhoz való hozzáférést:

A @Configuration public class SecurityConfiguration kiterjeszti a WebSecurityConfigurerAdapter {@Orride védett érvénytelen konfigurációt (HttpSecurity httpSecurity) a {httpSecurity.authorizeRequests () .antMatchers ("/ h2-console / **") .permitAll (). .és () .formLogin (); httpSecurity.csrf () .ignoringAntMatchers ("/ h2-console / **"); httpSecurity.headers () .frameOptions () .sameOrigin (); }}

Megjegyzés: itt a Spring Boot által végrehajtott korábbi biztonsági konfigurációt reprodukáljuk, de való életben valószínűleg egyáltalán nem fogjuk engedélyezni a H2 konzolt.

Most futtatjuk az alkalmazást és böngészünk a H2 konzolon. Ezt ellenőrizhetjük A Spring két táblázatot hoz létre beágyazott adatbázisunkban: felhasználók és hatóság.

Szerkezetük megfelel a korábban említett tavaszi biztonsági függelékben meghatározott struktúrának.

Végül hitelesítsük és kérjük a /fő végpont a kapcsolódó információk, beleértve a felhasználó adatait is.

2.4. A motorháztető alatt

A bejegyzés elején bemutattunk egy linket egy bemutatóhoz, amely elmagyarázta, hogyan testreszabhatjuk az adatbázis-alapú hitelesítést a UserDetailsService felület; határozottan javasoljuk, hogy nézze meg ezt a bejegyzést, ha meg akarjuk érteni, hogyan működnek a dolgok a motorháztető alatt.

Ebben az esetben ugyanezen interfész implementációjára támaszkodunk, amelyet a Spring Security biztosít; a JdbcDaoImpl.

Ha felfedezzük ezt az osztályt, meglátjuk a UserDetails az általa alkalmazott megvalósítás, valamint a felhasználói információk lekérésének mechanizmusai az adatbázisból.

Ez nagyon jól működik ebben az egyszerű forgatókönyvben, de van néhány hátránya, ha testre akarjuk szabni az adatbázis-sémát, vagy ha más adatbázis-szállítót akarunk használni.

Nézzük meg, mi történik, ha megváltoztatjuk a konfigurációt egy másik JDBC szolgáltatás használatára.

3. A séma adaptálása egy másik adatbázishoz

Ebben a szakaszban a MySQL adatbázis segítségével konfiguráljuk a projektünk hitelesítését.

Amint a következõkben láthatjuk, ennek elérése érdekében kerülnünk kell az alapértelmezett séma használatát, és meg kell adnunk a sajátunkat.

3.1. Függőségek és adatbázis-konfiguráció

Kezdőként távolítsuk el a h2 függőséget, és cserélje le a megfelelő MySQL könyvtárra:

 mysql mysql-connector-java 8.0.17 

Mint mindig, a könyvtár legújabb verzióját is megkereshetjük a Maven Central-ban.

Most állítsuk be ennek megfelelően az alkalmazás tulajdonságait:

spring.datasource.url = jdbc: mysql: // localhost: 3306 / jdbc_authentication spring.datasource.username = root Spring.datasource.password = pass

3.2. Az alapértelmezett konfiguráció futtatása

Természetesen ezeket testre kell szabni, hogy csatlakozzanak a futó MySQL szerverhez. Tesztelés céljából itt egy új példányt indítunk a Docker használatával:

dokkoló futtatása -p 3306: 3306 --name bael-mysql -e MYSQL_ROOT_PASSWORD = pass -e MYSQL_DATABASE = jdbc_authentication mysql: legújabb

Futtassuk most a projektet, hogy lássuk, az alapértelmezett konfiguráció alkalmas-e egy MySQL adatbázisra.

Valójában az alkalmazás nem tudja elindítani a SQLSyntaxErrorException. Ennek tulajdonképpen van értelme; mint mondtuk, az alapértelmezett automatikus konfiguráció nagy része alkalmas egy HSQLDB-re.

Ebben az esetben, a DDL szkript, amelyet a withDefaultSchema irányelv nem a MySQL-hez megfelelő nyelvjárást használ.

Ezért kerülnünk kell a séma használatát, és meg kell adnunk a sajátunkat.

3.3. A hitelesítési konfiguráció módosítása

Mivel nem akarjuk használni az alapértelmezett sémát, el kell távolítanunk a megfelelő utasítást a AuthenticationManagerBuilder konfiguráció.

Továbbá, mivel saját SQL parancsfájlokat adunk meg, elkerülhetjük a felhasználó programozott létrehozását:

@Autowired public void configureGlobal (AuthenticationManagerBuilder auth) dobja a Kivételt {auth.jdbcAuthentication () .dataSource (dataSource); }

Most nézzük meg az adatbázis inicializáló szkriptjeit.

Először a mi schema.sql:

CREATE TABLE felhasználók (VARCHAR (50) felhasználónév NOT NULL, jelszó VARCHAR (100) NOT NULL, engedélyezve van a TINYINT NOT NULL DEFAULT 1, PRIMARY KEY (felhasználónév)); CREATE TABLE hatóságok (VARCHAR felhasználónév (50) NOT NULL, jogosultság VARCHAR (50) NOT NULL, FORMAI KULCS (felhasználónév) REFERENCES felhasználók (felhasználónév)); CREATE UNIQUE INDEX ix_auth_username a hatóságoknál (felhasználónév, hatóság);

És akkor, a mi adatok.sql:

- Felhasználó user / pass INSERT INTO users (felhasználónév, jelszó, engedélyezve) értékek ('user', '$ 2a $ 10 $ 8.UnVuG9HHgffUDAlk8qfOuVGkqRzgVymGe07xd00DMxs.AQubh4a', 1); INSERT INTO hatóságok (felhasználónév, jogosultság) értékek ('felhasználó', 'ROLE_USER');

Végül módosítanunk kell néhány egyéb alkalmazási tulajdonságot:

  • Mivel most nem a hibernáltól várjuk a séma létrehozását, le kell tiltanunk a ddl-auto ingatlan
  • Alapértelmezés szerint a Spring Boot inicializálja az adatforrást csak a beágyazott adatbázisok esetében, ami itt nem így van:
spring.datasource.initialization-mode = mindig spring.jpa.hibernate.ddl-auto = nincs

Ennek eredményeként most képesnek kell lenniünk arra, hogy helyesen indítsuk el az alkalmazást, hitelesítve és visszakeresve a adatok a végponttól.

4. A lekérdezések adaptálása egy másik sémához

Menjünk egy lépéssel tovább. Képzelje el, hogy az alapértelmezett séma egyszerűen nem felel meg az igényeinknek.

4.1. Az alapértelmezett séma módosítása

Képzelje el például, hogy már van adatbázisunk, amelynek felépítése kissé eltér az alapértelmezettől:

CREATE TABLE bael_users (név VARCHAR (50) NOT NULL, e-mail VARCHAR (50) NOT NULL, jelszó VARCHAR (100) NOT NULL, engedélyezve a TINYINT NOT NULL DEFAULT 1, PRIMARY KEY (email)); TÁBLÁZAT jogosultságok létrehozása (e-mail: VARCHAR (50) NEM NULL, hatóság VARCHAR (50) NOT NULL, KÜLFÖLD KULCS (e-mail) REFERENCIÁK bael_users (e-mail)); CREATE UNIQUE INDEX ix_auth_email a hatóságoknál (e-mail, jogosultság);

Végül a mi adatok.sql a szkript is ehhez a változáshoz fog igazodni:

- Felhasználó [email protected] / pass INSERT INTO bael_users (név, e-mail, jelszó, engedélyezve) értékek ('user', '[email protected]', '$ 2a $ 10 $ 8.UnVuG9HHgffUDAlk8qfOuVGkqRzgVymGe07xd00DMxs.AQubh4a', 1); INSERT INTO hatóságok (e-mail, jogosultság) értékeit ('[email protected]', 'ROLE_USER');

4.2. Az alkalmazás futtatása az új sémával

Indítsuk el az alkalmazásunkat. Helyesen inicializálja, ennek van értelme, mivel a sémánk helyes.

Most, ha megpróbálunk bejelentkezni, hibát találunk a hitelesítő adatok bemutatásakor.

A Spring Security még mindig keresi a felhasználónév mező az adatbázisban. Szerencsénkre a JDBC hitelesítés konfigurációja lehetőséget kínál a hitelesítési folyamat felhasználói adatainak lekérésére használt lekérdezések testreszabása.

4.3. A keresési lekérdezések testreszabása

A lekérdezések adaptálása meglehetősen egyszerű. A. Konfigurálásakor egyszerűen meg kell adnunk saját SQL utasításokat AuthenticationManagerBuilder:

Az @Autowired public void configureGlobal (AuthenticationManagerBuilder válassza az e-mailt, a "+" jogosultságot a hatóságoktól "+" ahol email =? "); }

Még egyszer elindíthatjuk az alkalmazást, és elérhetjük a /fő végpont az új hitelesítő adatok használatával.

5. Következtetés

Mint láthatjuk, ez a megközelítés sokkal egyszerűbb, mint saját magunk létrehozása UserDetailServicemegvalósítás, amely nehéz folyamatokat von maga után; létrehozó entitások és osztályok a UserDetail felületet és adattárak hozzáadását a projektünkhöz.

A hátrány természetesen az a kevés rugalmasság, amelyet akkor nyújt, ha adatbázisunk vagy logikánk eltér az alapértelmezett stratégiától a Spring Security megoldás biztosítja.

Végül megnézhetjük a teljes példákat a GitHub-tárunkban. Még egy olyan példát is mellékeltünk a PostgreSQL használatával, amelyet nem mutattunk be ebben az oktatóanyagban, csak azért, hogy a dolgok egyszerűek legyenek.

Perzisztencia alsó

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

$config[zx-auto] not found$config[zx-overlay] not found