spring security a wyłuskanie danych o userze

spring security a wyłuskanie danych o userze
MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 123
0

jesli loguje sie jakims konkretnym username i password z bazy ktore odpowiadaja konkretnemu userowi to po zalogowaniu jak na przyklad wyluskac i wyswietlic powiedzmy e-mail tego konkretnego uzytkownika? Chodzi mi ze kazdy user po zalogowaniu ma zobaczyc na ekranie na przyklad swoj adres e-mail ktory podawal przy rejestracji. Jest on zapisany w bazie, kazdy user ma swojego maila ale jak go wyluskac zeby wyswietlic go na ekranie?

azalut
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1129
0

Musisz zrobic mniej wiecej tak:

  1. potrzebujesz ID uzytkownika albo jego hasło/username. Wedlug tego bedziesz szukał w bazie entity, ktore wyciagniesz zeby miec email.
  2. Robisz zapytanie do bazy i szukasz wedlug tego co masz (według ID, loginu, hasła)
  3. po tym zapytaniu otrzymasz entity np. User
  4. robisz tak jak napisała @karolinaa czyli np.
Kopiuj
//od poczatku, powiedzmy, ze masz username uzytkownika
String username = "jakisUsername";

User user = repository.findByUsername(username); //albo z entityManagera, jakiś service, zależy jaki framework itp, ale idea taka sama - pobrac usera

String email = user.getEmail();

//robisz coś z emailem

jak coś pisz :P

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Ja robiłem to w następujący sposób:

W controlerze używałem czegoś takiego:

Kopiuj
		
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName();
User loggedUser = userService.findByUsername(username);
String email = loggedUser.getEmail();

I później ten email dodajesz do modelu. Oczywiście id usera to był jego username.

  • Rejestracja: dni
  • Ostatnio: dni
0

A czy przypadkiem to Ci od razu nie zwraca usera w którego kontekście wywołana została metoda?

User loggedUser = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()

Zawsze można też stworzyć sobie ControllerAdvice, i przekazywać takiego usera od razu do ModelAttribute kontrolera.

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Geneva
0

Jezeli dobrze pamietam, to w parametrach metody konstruktora mozesz sobie od razu zazyczyc argumentu o tozsamosci.

Kopiuj
@RequestMapping(...)
public String test(Principal principal) {
}
SE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

Można zrobić coś takiego:

Kopiuj
@ControllerAdvice
public class UserControllerAdvice {

    @ModelAttribute
    public User currentUser(Authentication authentication) {
        if (null != authentication){
            return (User) authentication.getPrincipal();
        }
        return null;
    }
}

Potem tylko w parametrach kontrolera dopisujesz sobie: @ModelAttribute User user i gotowe.

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 123
0

ok probuje robic tak jak sugerujecie ale mam problem bo w DAO robie metode:

Kopiuj
@Override
	public String getEmployeeStatus(String username) {
		EmployeeEntity employee = (EmployeeEntity) sessionFactory.getCurrentSession().load(
                EmployeeEntity.class, username);
		return employee.getEmail();
	} 

i nie moge tak wywolac po usernamie, w innej metodzie wyciagam z sessionfactory po id i jest ok a jak robie tak jak powyzej to wyrzuca wyjatek:

Kopiuj
 
type Exception report

message Request processing failed; nested exception is org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.student.recruitment.app.entity.EmployeeEntity. Expected: class java.lang.Integer, got class java.lang.String

description The server encountered an internal error that prevented it from fulfilling this request.

exception 
O1
  • Rejestracja: dni
  • Ostatnio: dni
0

Ponieważ metoda load jako drugi parametr przyjmuje integer a nie String. Musisz samemu napisać metodę z zapytaniem wyciągającą użytkownika po nazwie.

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 123
0

cos takiego?

Kopiuj
sessionFactory.getCurrentSession().createQuery("from EmployeeEntity where username=username")

jak to dokladnie zrobic?

O1
  • Rejestracja: dni
  • Ostatnio: dni
0

Wpisz sobie w google Spring CRUD example i tam będziesz miał przykłady.
Powinno to wyglądać mniej więcej tak jak niżej pokazałem. Nie wiem czy to dokładnie zadziała bo z głowy piszę, więc to ma raczej charakter poglądowy. Musisz to sam dopasować do swojej aplikacji.

Kopiuj
	public User findByUserName(String username) {
 
		User user = null;
 
		Query query = sessionFactory.getCurrentSession()
			.createQuery("from EmployeeEntity where username = :username");
		query.setParameter("username", username);
		user = query.getSingleResult();
		return user;
	}

Ogólnie lepiej używać JPA zamiast tego Hibernatowego API.

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 123
0

@olek1, u ciebie ta klasa Query to z jakiej zaleznosci pochodzi? bo nie wiem skad zaimportowac.

ogolnie to mam teraz problem nastepujacy: mam username danego goscia i nie wiem jak za pomoca tej informacji wyciagnac co to za gosc czyli cala encje wywolac i na niej operowac np. metoda .getEmail. Przejrzalem w dokumantacji https://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/Query.html dostepne metody i nie widze tam takiej ktora by mi w tym pomogla. Kolega @olek1 ma na mysli zeby korzystac przy tym z JPA ale wolalbym to zrobic metodami hibernate'a. Da sie to zrobic?

O1
  • Rejestracja: dni
  • Ostatnio: dni
0

To jest z javax.persistence. Przecież moja powyższa przykładowa metoda zwraca całego usera.

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 123
0

@olek1, tak ale nie za bardzo moge zrobic to przy pomocy persistence bo jak importuje metode Query z pakietu javax to mam error:

Kopiuj
Type mismatch: cannot convert from org.hibernate.Query to javax.persistence.Query
 

a jak importuje z org.hibernate to nie ma tego errora, jest roznica typow.

O1
  • Rejestracja: dni
  • Ostatnio: dni
1

Pisz może co nie działa. Chodzi chyba o to, że ten Hibernatowy Query nie ma getSingleResult. Daj tam zamiast tego uniqueResult(). Albo zwróć listę. Tu masz przykłady używania API Hiberante: http://www.mkyong.com/hibernate/hibernate-query-examples-hql/

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 123
0

@olek1, uniqueResult nie moze byc bo to nie ten typ.

Kopiuj
 
Type mismatch: cannot convert from Object to User
MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 123
0

ok dziala juz wszystko, trik z lista okazal sie skuteczny, dzieki kolego @olek1 za pomoc

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.