Вход в Spring Security через DWR (Direct Web Remoting)

Я ищу способ входа/выхода пользователей с помощью DWR, чтобы я мог просто создать компонент DWR с методами входа и выхода.

public class AuthorizationHandler {

    @Autowired
    private UserRepository userRepository;


    public Map<String, String> loginUser(String userName, String password) {
        Map<String, String> map = new HashMap<>();
        if (userRepository.validate(userName, password)) {
            // login the user here       
            map.put("success", true);
            map.put("redirect", ...);
        } else {
            map.put("success", false);
        }
        return map;
    }


    public Map<String, String> logoutUser() {
        // logout the user here
        Map<String, String> map = new HashMap<>();
        map.put("success", "ok");
        return map;
    }
}

Моя проблема в том, что я не могу найти способ работать с пользователями и программно входить/выходить из них. Во всем руководстве используется конфигурация на основе xml, но то, что скрывается за ней, скрыто.


person Vojtěch    schedule 22.03.2012    source источник


Ответы (1)


В одном из моих приложений у меня было аналогичное требование, пожалуйста, найдите шаги, которые я выполнил

public void authenticateSession(HttpSession session, UserDetails user) {
    UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
            user.getUsername(), user.getPassword());
    UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(
            user, authRequest.getCredentials(), user.getAuthorities());
    result.setDetails(authRequest.getDetails());

    SecurityContext ctx = SecurityContextHolder.createEmptyContext();
    ctx.setAuthentication(result);

    session.setAttribute(
            UsernamePasswordAuthenticationFilter.SPRING_SECURITY_LAST_USERNAME_KEY,
            TextEscapeUtils.escapeEntities(user.getUsername()));
    session.setAttribute(
            HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY,
            ctx);

    AuthenticationSuccessEvent event = new AuthenticationSuccessEvent(
            result);
    applicationContext.publishEvent(event);
}

Этот метод аутентифицирует переданный сеанс с переданным объектом пользователя.

В вашем случае вы должны получить объект UserDetails и передать его этому методу вместе с текущим сеансом.

Вы можете использовать интерфейс UserDetailsService для загрузки файла UserDetails.

person Arun P Johny    schedule 22.03.2012
comment
Это выглядит довольно мило. Однако я не знаю, как правильно получить HttpSession с DWR. Я пробовал HttpSession session = WebContextFactory.get().getSession();, но это приводит только к ошибкам CSRF-атаки, выдаваемым DWR сразу после вызова метода getSession. Кроме того, мне нужно получить доступ к applicationContext и опубликовать события? - person Vojtěch; 22.03.2012
comment
Я не знаком с DWR, но в этом случае вы можете получить объект запроса и создать новый сеанс с request.getSession(true), а затем отправить session id обратно клиенту и установить файл cookie JSESSIONID с этим значением. - person Arun P Johny; 22.03.2012
comment
Если указать HttpSession в методе java, вызываемом DWR, DWR сам внедрит объект сеанса. Это также работает для WebRequest и контекстов. Обратите внимание на документацию здесь: directwebremoting.org/dwr/documentation/server/ javaapi.html - person J E Carter II; 06.04.2018