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.

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

Robot: CCBot (2x)