Как да удостоверявате ръчно потребителя с пролетна сигурност

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

В тази бърза статия ще се съсредоточим върху това как програмно да зададем удостоверен потребител в Spring Security и Spring MVC.

2. Пролетна сигурност

Просто казано, Spring Security съхранява основната информация за всеки удостоверен потребител в ThreadLocal - представен като обект за удостоверяване .

За да конструираме и зададем този обект за удостоверяване - трябва да използваме същия подход, който Spring Security обикновено използва, за да изгради обекта на стандартно удостоверяване.

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

UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass); Authentication auth = authManager.authenticate(authReq); SecurityContext sc = SecurityContextHolder.getContext(); sc.setAuthentication(auth);

След като зададем удостоверяването в контекста, сега ще можем да проверим дали текущият потребител е удостоверен - използвайки securityContext.getAuthentication (). IsAuthenticated () .

3. Пролетен MVC

По подразбиране Spring Security добавя допълнителен филтър във филтърната верига Spring Security - който е способен да запази контекста на защита ( клас SecurityContextPersistenceFilter ).

На свой ред той делегира постоянството на контекста на защитата на екземпляр на SecurityContextRepository , по подразбиране на класа HttpSessionSecurityContextRepository .

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

public void login(HttpServletRequest req, String user, String pass) { UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass); Authentication auth = authManager.authenticate(authReq); SecurityContext sc = SecurityContextHolder.getContext(); sc.setAuthentication(auth); HttpSession session = req.getSession(true); session.setAttribute(SPRING_SECURITY_CONTEXT_KEY, sc); }

SPRING_SECURITY_CONTEXT_KEY е статично импортиран HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY .

Трябва да се отбележи, че не можем директно да използваме HttpSessionSecurityContextRepository - защото работи съвместно с SecurityContextPersistenceFilter.

Това е така, защото филтърът използва хранилището, за да зареди и съхрани контекста на защитата преди и след изпълнението на останалите дефинирани филтри във веригата, но използва персонализирана обвивка над отговора, който се предава на веригата.

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

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

В този бърз урок разгледахме как ръчно да зададете удостоверяване на потребителя в контекста на Spring Security и как може да бъде предоставено за целите на Spring MVC, като се фокусирахме върху примерните кодове, които илюстрират най-простия начин за постигането му.

Както винаги, примерни кодове могат да бъдат намерени в GitHub.