3 votes

La sécurité de Spring accède à UserDetailsService à partir de couches plus profondes

Je dispose de l'implémentation suivante de UserDetailsService.
Le processus d'authentification fonctionne très bien jusqu'à présent.
Comment puis-je stocker mon "MyUser bean" ( qui se sont connectés avec succès ) dans la "session" afin que je puisse y avoir accès dans d'autres zones de mon application.

Merci.

@Transactional(readOnly = true)
public class CustomUserDetailsService implements UserDetailsService {

    private EmployeesApi employeesApi = new EmployeesApi();

    /**
     * Retrieves a user record containing the user's credentials and access. 
     */
    public UserDetails loadUserByUsername(String userName)
            throws UsernameNotFoundException, DataAccessException {

        // Declare a null Spring User
        UserDetails user = null;

        try {

            MyUser employee = employeesApi.getByUserName(userName);

            user =  new User(
                    employee.getUserName(), 
                    employee.getPassword().toLowerCase(),
                    true,
                    true,
                    true,
                    true,
                    getAuthorities(1) );

        } catch (Exception e) {
            logger.error("Error in retrieving user");
            throw new UsernameNotFoundException("Error in retrieving user");
        }

    }
    ....

6voto

axtavt Points 126632

Spring Security stocke déjà UserDetails de l'utilisateur authentifié en session pour vous.

Donc, le moyen le plus simple de stocker MyUser en session est d'implémenter un UserDetails qui contient une référence à MyUser :

public class MyUserDetails extends User {
    private MyUser myUser;
    public MyUserDetails(..., MyUser myUser) {
        super(...);
        this.myUser = myUser;
    }
    public MyUser getMyUser() {
        return myUser;
    }
    ...
}

Et renvoyez-le de votre UserDetailsService :

MyUser employee = employeesApi.getByUserName(userName);
user =  new MyUserDetails(..., myUser);

Ensuite, vous pouvez facilement accéder MyUser via le contexte de sécurité :

MyUser myUser = ((MyUserDetails) SecurityContextHolder
    .getContext().getAuthentication().getPrincipal()).getMyUser();

Dans le contrôleur Spring MVC :

@RequestMapping(...)
public ModelAndView someController(..., Authentication auth) {
    MyUser myUser = ((MyUserDetails) auth.getPrincipal()).getMyUser();
    ...
}

En JSP :

<security:authentication var = "myUser" property="principal.myUser" />

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X