Изтеглете потребителска информация в Spring Security

1. Общ преглед

Тази статия ще покаже как да извлечете потребителските данни в Spring Security .

Понастоящем удостовереният потребител е достъпен през редица различни механизми през пролетта - нека първо разгледаме най-често срещаното решение - програмен достъп.

2. Вземете потребителя в Bean

Най-простият начин за извличане на удостоверения в момента принципал е чрез статично извикване на SecurityContextHolder :

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); String currentPrincipalName = authentication.getName();

Подобрение на този фрагмент е първо да се провери дали има удостоверен потребител, преди да се опита да осъществи достъп до него:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (!(authentication instanceof AnonymousAuthenticationToken)) { String currentUserName = authentication.getName(); return currentUserName; }

Разбира се, има статични извиквания като този - намалената проверимост на кода е един от най-очевидните. Вместо това ще проучим алтернативни решения за това много често срещано изискване.

3. Вземете потребителя в контролер

В коментиран боб с @Controller има допълнителни опции. Принципалът може да бъде дефиниран директно като аргумент на метод и той ще бъде правилно разрешен от рамката:

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

Като алтернатива можем да използваме и маркера за удостоверяване :

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

API на класа за удостоверяване е много отворен, така че рамката остава възможно най-гъвкава. Поради това принципа на Spring Security може да бъде извлечен само като обект и трябва да бъде прехвърлен към правилния екземпляр UserDetails :

UserDetails userDetails = (UserDetails) authentication.getPrincipal(); System.out.println("User has authorities: " + userDetails.getAuthorities());

И накрая, директно от HTTP заявката :

@Controller public class GetUserWithHTTPServletRequestController { @RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserNameSimple(HttpServletRequest request) { Principal principal = request.getUserPrincipal(); return principal.getName(); } }

4. Вземете потребителя чрез потребителски интерфейс

За да използваме изцяло инжекцията на зависимостта Spring и да можем да извлечем удостоверяването навсякъде, не само в зърната @Controller , трябва да скрием статичния достъп зад проста фасада:

public interface IAuthenticationFacade { Authentication getAuthentication(); } @Component public class AuthenticationFacade implements IAuthenticationFacade { @Override public Authentication getAuthentication() { return SecurityContextHolder.getContext().getAuthentication(); } }

Фасадата излага обекта за удостоверяване, като същевременно скрива статичното състояние и поддържа кода отделен и напълно проверяем:

@Controller public class GetUserWithCustomInterfaceController { @Autowired private IAuthenticationFacade authenticationFacade; @RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserNameSimple() { Authentication authentication = authenticationFacade.getAuthentication(); return authentication.getName(); } }

5. Вземете потребителя в JSP

Понастоящем удостовереният принципал може да бъде достъпен и в JSP страници , като се използва пролетната поддръжка на таглиб за сигурност. Първо, трябва да дефинираме маркера на страницата:

След това можем да се позовем на принципала :

 authenticated as  

6. Вземете потребителя в Thymeleaf

Thymeleaf е модерен уеб сървър за шаблониране с добра интеграция с Spring MVC рамката. Нека да видим как да осъществим достъп до удостоверения в момента принципал на страница с двигател Thymeleaf.

Първо, трябва да добавим зависимостите thymeleaf-spring5 и thymeleaf-extras-springsecurity5, за да интегрираме Thymeleaf с Spring Security:

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

Сега можем да се позовем на принципала в HTML страницата, използвайки атрибута sec: autorize :

 Authenticated as 

7. Заключение

Тази статия показа как да получите информация за потребителя в приложение Spring, като се започне с общия механизъм за статичен достъп, последван от няколко по-добри начина за инжектиране на принципала.

Изпълнението на тези примери може да бъде намерено в проекта GitHub - това е проект, базиран на Eclipse, така че трябва да е лесно да се импортира и да се изпълнява както е. Когато проектът се изпълнява локално, HTML на началната страница може да бъде достъпен на:

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