Как запомнить пользователя в Spring Boot? - PullRequest
0 голосов
/ 06 мая 2020

Извините, если это очевидная вещь, но я новичок в программировании. У меня есть приложение, чтобы иметь возможность входить / регистрироваться пользователей, но как только я перехожу на другую страницу в приложении, а затем go обратно на страницу пользователя, оно действует так, как будто я не вошел в систему. Я не уверен, как заставить его помнить, что я вошел в систему. Я предполагаю, что мне нужно передать данные сеанса из моего пользовательского контроллера в мой другой класс контроллера. Но, честно говоря, я просто заблудился. Любая помощь будет принята с благодарностью.

Мой код аутентификации

public static final String userSessionKey = "user";


public User getUserFromSession(HttpSession session) {
    Integer userId = (Integer) session.getAttribute(userSessionKey);
    if (userId == null) {
        return null;
    }

    Optional<User> user = userDao.findById(userId);

    if (user.isEmpty()) {
        return null;
    }

    return user.get();
}

public static void setUserInSession(HttpSession session, User user) {
    session.setAttribute(userSessionKey, user.getId());
}

Мой код входа (событие после входа в систему, если я снова нажму вкладку входа в систему, он приведет меня к маршруту входа, а не маршрут учетной записи пользователя.)

@RequestMapping(value = "login", method = RequestMethod.GET)
public String displayLogin(HttpServletRequest session, Model model){

    if (session.getAttribute(userSessionKey) == null){
        model.addAttribute("title", "Login");
        model.addAttribute("users", userDao.findAll());
        return "user/login";
    }

    return "user/account";
}

@RequestMapping(value = "login", method = RequestMethod.POST)
public String processLogin(@RequestParam(name = "password") String password,
                           @RequestParam(name = "email")String email,
                           Model model){
    for(User theUser: userDao.findAll()){
        if(theUser.getEmail().equals(email) && theUser.getPassword().equals(password)) {
            model.addAttribute("userAccount", theUser);
            return "user/account";
        }else{
            model.addAttribute("invalidCredentials", true);
        }
    }

    return "user/account";
}

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

@OneToOne
public UserController userController;

@Autowired
private PaoDao paoDao;

@Autowired
private UserDao userDao;

@RequestMapping(value = "remove", method = RequestMethod.GET)
public String displayRemovePaoForm(HttpSession session, Model model) {

    if (userController.getUserFromSession() == null){
        model.addAttribute("title", "Login");
        model.addAttribute("users", userDao.findAll());
        return "redirect:login";
    }

    model.addAttribute("paos", paoDao.findAll());
    model.addAttribute("title", "Remove Pao");
    return "pao/remove";
}

Все, что я хочу - войти в систему и оставаться в системе, пока я не выйду, я понятия не имею, как это сделать. Спасибо за любую помощь.

1 Ответ

0 голосов
/ 06 мая 2020

Вы должны использовать тип хранилища для хранения сеанса пользователя. Вы можете использовать два типа хранилищ: jdb c и redis

Для JDB C используйте свойство : spring.session.store-type=jdbc в файле application.properties.

Добавить зависимость для JDB C:

    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-jdbc</artifactId>
    </dependency>

Для redis используйте свойство : spring.session.store-type=redis в файле application.properties.

Добавить зависимость для redis:

    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

Это может быть полезно .. !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...