2016-04-21 4 views
0

У меня есть веб-приложение, в котором определенный URL/newPost должен быть доступен только одному пользователю, администратору. При попытке перейти к '/ newPost', пользователь должен быть перенаправлен на страницу входа, где он должен подтвердить свою личность как admin.

Это все работает, за исключением случаев, когда пользователь заполняет форму входа в систему, форма отправляется каждый раз в '/ login'. Я в настоящее время не понимаю, почему он отправляет на «/ login» вместо пути, который я перенаправляю на использование листьев тимьяна: th:action="@{/newPost}"Spring Security для одного пользователя

TLDR; Я продолжаю перенаправляться в/login после отправки формы входа. Я использую Spring boot, Spring security и thymeleaf.

Контроллер:

/*Keeps getting called*/ 
@RequestMapping(value="/login", method=RequestMethod.GET) 
public String login(Model model) 
{ 
    model.addAttribute("lc", new LoginCredentials()); 
    System.out.println("Login controller"); 
    return "login"; 
} 

/*RequestMapping I want to be called*/ 
@RequestMapping(value="/newPost", method = RequestMethod.GET) 
public String isLoggedIn(@ModelAttribute LoginCredentials lc, Model model) 
{ 
    if(lc.isAdmin()) 
    { 
     System.out.println("lc is admin"); 
     model.addAttribute("bp",new BlogPost()); 
     return "newPost"; 
    } else 
    { 
     System.out.println("lc is not admin"); 
     return "login"; 
    } 
} 

Войти Форма: Конфигурация

<form class="form-signin" th:action="@{/newPost}" th:object="${lc}" method = "post"> 
    <h2 class="form-signin-heading">Please sign in</h2> 
    <label for="inputEmail" class="sr-only">Username</label> 
    <input type="text" id="username" class="form-control" th:field="*{inputUsername}" placeholder="Username" required="required" autofocus="autofocus" /> 
    <label for="inputPassword" class="sr-only">Password</label> 
    <input type="password" id="password" th:field="*{inputPsswd}" class="form-control" placeholder="Password" required ="required" /> 

    <button class="btn btn-lg btn-primary btn-block" type="submit" style="background-color:#F6358A;">Sign in</button> 
    </form> 

Безопасность:

httpSecurity 
    .authorizeRequests() 
     .antMatchers("/","/videos","/BlogPost","/index","/aboutUs").permitAll() 
     .anyRequest().authenticated() 
     .and() 
    .formLogin() 
     .loginPage("/login") 
     .permitAll(); 
+0

Ваша форма почтовой системы и URL-адреса этой формы для newPost. Можете ли вы добавить более подробную информацию об этом методе? Кроме того, форма, которую вы публикуете, является формой входа в систему, поэтому, когда вы настраиваете Spring Security для обработки информации для входа? –

+1

Потому что вы не используете Spring Security, но работаете вокруг ... –

+0

@ M.Deinum Спасибо за ваш комментарий. Это побудило меня прочитать дополнительную документацию Spring Security, изучить ее, а затем по-настоящему устранить проблему. – Turtle

ответ

0

Мой предыдущий вопрос был беспорядок. Это был мой первый опыт работы с Java Spring и мои вопросы. Надеюсь, это объяснение поможет будущему пользователю.

Во-первых:

Действие не должно отличаться от/входа. Я по сути вызывал бесконечный цикл логинов, потому что я отправлял пользователя в/newPost, представив форму входа, но они не могли получить доступ к/newPost, пока не предоставили правильные учетные данные. Весна послушно перенаправила пользователя в/login, чтобы предоставить правильные учетные данные, повторяя процесс.

Это:

th:action="@{/newPost}" 

должно быть:

th:action="@{/login}" 

с соответствующим RequestMapping, как так:

@RequestMapping(value="/login", method=RequestMethod.POST) 
public String loginPost(Model model) 
{ 
//do foo 
} 

Во-вторых:

Я попытался выполнить работу Spring Security.

if(lc.isAdmin()) 
{ 
    System.out.println("lc is admin"); 
    model.addAttribute("bp",new BlogPost()); 
    return "newPost"; 
} else 
{ 
    System.out.println("lc is not admin"); 
    return "login"; 
} 

Поскольку я нужна только безопасность для одного пользователя, я настроил объект AuthenticationManagerBuilder в моей конфигурации безопасности, как так:

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) 
{ 
    try 
    { 
    auth 
     .inMemoryAuthentication() 
      .withUser("admin") 
      .password("password") 
      .roles("ADMIN"); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
} 

В-третьих:

Поскольку я изменил Спрингс глобальной конфигурации, я не должен передавать объект login.html.В новой форме должны использоваться поля ввода, такие как:

<form class="form-signin" th:action="@{/login}" method = "post"> 
    <h2 class="form-signin-heading">Please sign in</h2> 
    <label for="inputEmail" class="sr-only">Username</label> 
    <input type="text" id="username" name="username" class="form-control" placeholder="Username" required="required" autofocus="autofocus" /> 
    <label for="inputPassword" class="sr-only">Password</label> 
    <input type="password" id="password" name="password" class="form-control" placeholder="Password" required ="required" /> 

    <button class="btn btn-lg btn-primary btn-block" type="submit" style="background-color:#F6358A;">Sign in</button> 
    </form> 
0

Что ваш Логин имя страницы JSP? Это «login.jsp»?

Метод входа в систему возвращает «login», это означает, что он вернется к login.jsp.

User return "/ newPost" вместо этого.

+0

Я не использую jsps, я использую тимелеаф. – Turtle

Смежные вопросы