Можно ли разрешить доступ к странице только через перенаправление? - PullRequest
0 голосов
/ 11 мая 2018

Я работаю над приложением, использующим Spring Boot и Thymeleaf.

У меня есть следующий фрагмент на моей странице входа в систему:

<p th:if="${param.logout}">Logged out successfully</p>

Этот параграф связан со следующей конфигурацией безопасности:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
            .antMatchers("/", "*.css").permitAll()
            .antMatchers("/myendpoint").authenticated()
            .and()
            .formLogin().loginPage("/login").permitAll()
            .and()
            .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login?logout")
                .permitAll();
}

Таким образом, после выхода из системы пользователь перенаправляется на /login?logout и отображается сообщение о выходе.

Моя проблема в том, что это сообщение также отображается, когда пользователь явно переходит на /login?logout, просто записывая http://myserver:8080/login?logout в браузер.

Можно ли запретить пользователю прямой доступ к /login?logout (и, таким образом, показывать сообщение только при фактическом выходе из системы)?

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Другой возможностью может быть форвард:

http
    .logout()
        .logoutSuccessHandler(
            (request, response, authentication) -> {
                request.setAttribute("loggedOut");
                request.getRequestDispatcher("/logged-out")
                       .forward(request, response);
            });

// ...

@Controller
class LoggedOutController {
    @PostMapping("/logged-out")
    public String loggedOut() {
        return "login";
    }
}

Где /logged-out отображает страницу входа, просто используя атрибут запроса вместо параметра для отображения соответствующего сообщения.

0 голосов
/ 12 мая 2018

После некоторых исследований я решил использовать RedirectAttributes и addFlashAttribute() для передачи данных на мою страницу входа в систему при выходе из системы.

Поэтому вместо установки logout в качестве параметра запроса я удалил Springобработка выхода из системы по умолчанию из моей конфигурации безопасности:

http
    .authorizeRequests()
    .antMatchers("/", "*.css").permitAll()
    .antMatchers("/myendpoint").authenticated()
    .and()
    .formLogin().loginPage("/login").permitAll();

И создал следующую настраиваемую конечную точку выхода из системы в моем контроллере:

@PostMapping("/logout-user")
public String logout(HttpServletRequest request, RedirectAttributes attrs) {
    new SecurityContextLogoutHandler().logout(request, null, null);

    // this attribute will be received in /login
    attrs.addFlashAttribute("logout", true);

    return "redirect:/login";
}

Поэтому я отправляю запрос на выход из системы этой конечной точке и проверяю наличиеАтрибут logout в /login, для отображения сообщения о выходе при необходимости:

<p th:if="${logout}">Logged out successfully</p>

Кажется, что он работает безупречно.

0 голосов
/ 11 мая 2018

Попробуйте это.

Создать класс как следовать

AppConstant

public class AppConstant 
{
    public static final String USER = "user";
}

Util

public class Util {
    public static boolean checkSessionExist(HttpServletRequest request)

    {
        HttpSession session = request.getSession();
        if(session.getAttribute(AppConstant.USER) == null)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
}

Способ входа

if(//Login credentials)
{
    session.setAttribute(AppConstant.USER, usermaster);
    //usermaster= it is object of your user master
}

Перенаправление страницы

    UserMaster  usermaster = (UserMaster) session.getAttribute(AppConstant.USER);
    if(!Util.checkSessionExist(request))
    {
        return "redirect:login";
    }
    else
    {
         //Your Pager
    }

Используйте этот метод для каждой функции перенаправления страниц.

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