Haal gebruikersinformatie op in Spring Security

1. Overzicht

Dit artikel laat zien hoe haal de gebruikersgegevens op in Spring Security.

De momenteel geauthenticeerde gebruiker is beschikbaar via een aantal verschillende mechanismen in Spring - laten we de meest voorkomende oplossing bespreken - eerst programmatische toegang.

2. Haal de gebruiker in een boon

De eenvoudigste manier om de momenteel geverifieerde principal op te halen, is via een statische aanroep van de SecurityContextHolder:

Authenticatie authenticatie = SecurityContextHolder.getContext (). GetAuthentication (); String currentPrincipalName = authentication.getName ();

Een verbetering van dit fragment is om eerst te controleren of er een geverifieerde gebruiker is voordat u er toegang toe probeert te krijgen:

Authenticatie authenticatie = SecurityContextHolder.getContext (). GetAuthentication (); if (! (authenticatie-exemplaar van AnonymousAuthenticationToken)) {String currentUserName = authentication.getName (); retourneer currentUserName; }

Er zijn natuurlijk nadelen aan het hebben van een statische oproep als deze - verminderde testbaarheid van de code is een van de meest voor de hand liggende. In plaats daarvan zullen we alternatieve oplossingen onderzoeken voor deze veel voorkomende vereiste.

3. Haal de gebruiker in een controller

In een @Controller geannoteerde boon, er zijn extra opties. De principal kan direct worden gedefinieerd als een methode-argument en het zal correct worden opgelost door het raamwerk:

@Controller public class SecurityController {@RequestMapping (value = "/ gebruikersnaam", method = RequestMethod.GET) @ResponseBody public String currentUserName (Principal principal) {return principal.getName (); }}

Alternatief, we kunnen ook het authenticatietoken gebruiken:

@Controller public class SecurityController {@RequestMapping (value = "/ username", method = RequestMethod.GET) @ResponseBody public String currentUserName (Authenticatie authenticatie) {return authentication.getName (); }}

De API van de Authenticatie klasse is heel open zodat het raamwerk zo flexibel mogelijk blijft. Door dit, de Spring Security-principal kan alleen worden opgehaald als een Voorwerp en moet op de juiste manier worden gegoten Gebruikersdetails voorbeeld:

UserDetails userDetails = (UserDetails) authentication.getPrincipal (); System.out.println ("Gebruiker heeft bevoegdheden:" + userDetails.getAuthorities ());

En tot slot direct van het HTTP-verzoek:

@Controller openbare klasse GetUserWithHTTPServletRequestController {@RequestMapping (waarde = "/ gebruikersnaam", method = RequestMethod.GET) @ResponseBody openbare String currentUserNameSimple (verzoek HttpServletRequest) {Principal principal = request.getUserPrincipal (); return principal.getName (); }}

4. Haal de gebruiker op via een aangepaste interface

Om de Spring-afhankelijkheidsinjectie volledig te benutten en de authenticatie overal te kunnen ophalen, niet alleen in @Controller bonen, we moeten de statische toegang verbergen achter een eenvoudige gevel:

openbare interface IAuthenticationFacade {Authentication getAuthentication (); } @Component openbare klasse AuthenticationFacade implementeert IAuthenticationFacade {@Override openbare verificatie getAuthentication () {retourneer SecurityContextHolder.getContext (). GetAuthentication (); }}

De gevel stelt de Authenticatie object terwijl de statische toestand wordt verborgen en de code ontkoppeld en volledig testbaar blijft:

@Controller openbare klasse GetUserWithCustomInterfaceController {@Autowired privé IAuthenticationFacade authenticationFacade; @RequestMapping (value = "/ gebruikersnaam", method = RequestMethod.GET) @ResponseBody openbare String currentUserNameSimple () {Authenticatie authentication = authenticationFacade.getAuthentication (); retourneer authentication.getName (); }}

5. Haal de gebruiker op in JSP

De momenteel geverifieerde opdrachtgever is ook toegankelijk via JSP-pagina's, door gebruik te maken van de taglib-ondersteuning van de veerbeveiliging. Eerst moeten we de tag op de pagina definiëren:

Vervolgens kunnen we verwijzen naar de opdrachtgever:

 geverifieerd als 

6. Haal de gebruiker op in Thymeleaf

Thymeleaf is een moderne server-side websjabloon-engine, met goede integratie met het Spring MVC-framework. Laten we eens kijken hoe we toegang kunnen krijgen tot de momenteel geverifieerde hoofdrolspeler op een pagina met de Thymeleaf-engine.

Eerst moeten we de thymeleaf-spring5 en de thymeleaf-extras-springsecurity5 afhankelijkheden om Thymeleaf te integreren met Spring Security:

 org.thymeleaf.extras thymeleaf-extras-springsecurity5 org.thymeleaf thymeleaf-spring5 

Nu we kunnen verwijzen naar de principal in de HTML-pagina met behulp van de sec: autoriseren attribuut:

 Geverifieerd als 

7. Conclusie

Dit artikel liet zien hoe je de gebruikersinformatie in een Spring-applicatie kunt krijgen, te beginnen met het algemene statische toegangsmechanisme, gevolgd door verschillende betere manieren om de principal te injecteren.

De implementatie van deze voorbeelden is te vinden in het GitHub-project - dit is een op Eclipse gebaseerd project, dus het moet gemakkelijk te importeren en uit te voeren zijn zoals het is. Als het project lokaal wordt uitgevoerd, is de HTML van de homepage toegankelijk via:

// localhost: 8080 / spring-security-rest-custom / foos / 1