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