Standard kodeordskoder i Spring Security 5

1. Oversigt

I Spring Security 4 var det muligt at gemme adgangskoder i almindelig tekst ved hjælp af autentificering i hukommelsen.

En større revision af adgangskodeadministrationsprocessen i version 5 har indført en mere sikker standardmekanisme til kodning og afkodning af adgangskoder. Dette betyder, at hvis din Spring-applikation gemmer adgangskoder i almindelig tekst, kan opgradering til Spring Security 5 medføre problemer.

I denne korte vejledning beskriver vi et af disse potentielle problemer og demonstrerer en løsning.

2. Forårssikkerhed 4

Vi starter med at vise en standard sikkerhedskonfiguration, der giver enkel autentificering i hukommelsen (gyldig for Spring 4):

@Configuration offentlig klasse InMemoryAuthWebSecurityConfigurer udvider WebSecurityConfigurerAdapter {@Override beskyttet ugyldig konfiguration (AuthenticationManagerBuilder auth) kaster Undtagelse {auth.inMemoryAuthentication () .withUser ("spring") .password ("hemmelig") ".roles (" US ") .roles." } @ Override beskyttet ugyldig konfiguration (HttpSecurity http) kaster undtagelse {http.authorizeRequests () .antMatchers ("/ private / **"). Godkendt () .antMatchers ("/ public / **") .permitAll (). Og () .httpBasic (); }} 

Denne konfiguration definerer godkendelse for alle /privat/ kortlagte metoder og offentlig adgang til alt under /offentlig/.

Hvis vi bruger den samme konfiguration under Spring Security 5, får vi følgende fejl:

java.lang.IllegalArgumentException: Der er ingen PasswordEncoder kortlagt til id'et "null"

Fejlen fortæller os, at den givne adgangskode kunne ikke afkodes, da der ikke var konfigureret en kodeordskodning til vores autentificering i hukommelsen.

3. Forårssikkerhed 5

Vi kan rette denne fejl ved at definere en DelegeringPasswordEncoder med PasswordEncoderFabrikker klasse.

Vi bruger denne indkoder til at konfigurere vores bruger med AuthenticationManagerBuilder:

@Configuration offentlig klasse InMemoryAuthWebSecurityConfigurer udvider WebSecurityConfigurerAdapter {@Override beskyttet ugyldig konfiguration (AuthenticationManagerBuilder auth) kaster Undtagelse {PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder (); auth.inMemoryAuthentication () .withUser ("spring") .password (encoder.encode ("secret")) .roles ("USER"); }} 

Nu, med denne konfiguration, gemmer vi vores adgangskode til hukommelse ved hjælp af BCrypt i følgende format:

{bcrypt} $ 2a $ 10 $ MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS 

Selvom vi kan definere vores eget sæt kodeordskodere, anbefales det at holde fast i standardkoderne, der er angivet i PasswordEncoderFabrikker.

3.2. NoOpPasswordEncoder

Hvis vi af en eller anden grund ikke vil kode den konfigurerede adgangskode, kan vi gøre brug af NoOpPasswordEncoder.

For at gøre det, foretrækker vi simpelthen den adgangssætning, vi giver, til adgangskode() metode med {noop} identifikator:

@Configuration public class InMemoryNoOpAuthWebSecurityConfigurer udvider WebSecurityConfigurerAdapter {@Override beskyttet ugyldig konfiguration (AuthenticationManagerBuilder auth) kaster Undtagelse {auth.inMemoryAuthentication () .withUser ("spring") .password ("{no};" }} 

På denne måde vil Spring Security bruge NoOpPasswordEncoder under emhætten, når den sammenligner adgangskoden fra brugeren med den, vi konfigurerede ovenfor.

Bemærk dog at vi aldrig skal bruge denne tilgang til produktionsapplikationen! Som den officielle dokumentation siger, er NoOpPasswordEncoder er udfaset at angive, at det er en ældre implementering, og at bruge det betragtes som usikkert.

3.3. Migrering af eksisterende adgangskoder

Vi kan opdatere eksisterende adgangskoder til de anbefalede Spring Security 5-standarder ved at:

  • Opdatering af gemte adgangskoder i almindelig tekst med deres kode kodet:
Streng kodet = ny BCryptPasswordEncoder (). Kodning (plainTextPassword); 
  • Præfiksering af hashede lagrede adgangskoder med deres kendte kodeidentifikator:
{bcrypt} $ 2a $ 10 $ MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS {sha256} 97cde38028ad898ebc02e690819fa220e88c62e0699403c94f94a0fc 
  • Anmodning til brugere om at opdatere deres adgangskoder, når kodningsmekanismen for gemte adgangskoder er ukendt

4. Konklusion

I dette hurtige eksempel opdaterede vi en gyldig Spring 4-hukommelsesautentificeringskonfiguration til Spring 5 ved hjælp af den nye adgangskodelagringsmekanisme.

Som altid kan du finde kildekoden på GitHub-projektet.


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