2012-02-20 6 views
8

Po prostu proste pytanie: jaki jest najlepszy sposób dodawania atrybutów (właściwości) do HttpSession w przypadku uwierzytelniania sukcesu? ID użytkownika na przykład.Spring Security: umieść dodatkowe atrybuty (właściwości) w sesji na sukces Uwierzytelnienie

Na razie używam własną implementację SimpleUrlAuthenticationSuccessHandler w UsernamePasswordAuthenticationFilter i robi to tak:

public void onAuthenticationSuccess(HttpServletRequest request, 
      HttpServletResponse response, Authentication auth) 
      throws IOException, ServletException { 
     PersonBean person = (PersonBean) auth.getPrincipal(); 
     request.getSession().setAttribute("currentUserId", person .getId().toString()); 
     super.onAuthenticationSuccess(request, response, auth); 

Ale nie sądzę że jest to dobre podejście, ponieważ nie ma innego sposoby wykonywania uwierzytelniania (Twój na zawsze na przykład) .

Więc czego potrzebuję użyć tutaj?

Odpowiedz

5

Odpowiedź została podana na wiosennym forum. Link.

Ogólnie rzecz biorąc, należy wdrożyć ApplicationListener, który nasłuchuje zdarzeń succes i umieszcza dodatkowe atrybuty w sesji tam.

Ale w moim przypadku nie jest wymagane przechowywanie atrybutów w sesji. Mogę pobrać identyfikator użytkownika, jak tutaj:

var userId = ${pageContext.request.userPrincipal.principal.id} 
-1

Wiosna robi to za Ciebie, musisz utworzyć tabelę * persistent_logins *, tutaj jest fragment z kontekstu aplikacji, który może pomóc. I położyć oficjalna Doc describe in detail co jest potrzebne:

<security:http auto-config='true'> 
    <security:intercept-url pattern="/**" access="ROLE_USER" /> 
    <security:form-login login-page="/Login" 
    authentication-success-handler-ref="authenticationSuccessHandler" 
    authentication-failure-url="/Login?login_error=1" /> 
    <security:remember-me data-source-ref="dataSource" 
    user-service-ref="myUserService" /> 
</security:http> 

a następnie można uzyskać dostęp do głównego obiektu z dowolnego miejsca w aplikacji, na przykład poniżej pokazuje znacznik do wyjściowego nazwę użytkownika w jsp:

<sec:authentication property="principal.username" /> 

iz twojego kodu java można to zrobić:

MyUser user = (MyUser) authentication.getPrincipal(); 
+2

Tabela persistent_logins tak naprawdę nie ma nic wspólnego z przechowywaniem atrybutów w sesji. To tylko szczególna implementacja "pamiętaj mi". Sensowne jest jednak przechowywanie dodatkowych niestandardowych atrybutów użytkownika w obiekcie uwierzytelniania. –

Powiązane problemy