spring security a wyłuskanie danych o userze

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?

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.
//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

0

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

W controlerze używałem czegoś takiego:

		
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.

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.

0

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

@RequestMapping(...)
public String test(Principal principal) {
}
0

Można zrobić coś takiego:

@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.

0

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

@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:

 
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 
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.

0

cos takiego?

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

jak to dokladnie zrobic?

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.

	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.

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?

0

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

0

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

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.

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/

0

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

 
Type mismatch: cannot convert from Object to User
0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1