2015-09-14 5 views
0

Я использую Spring Security 4.0.2.RELEASE с Spring 4.2.0.RELEASE.Выход с Spring Security с конфигурацией Java

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

Рассмотрим:

Настройка DelegatingFilterProxy в Java с WebApplicationInitializer:

public class SecurityWebInitializer 
    extends AbstractSecurityWebApplicationInitializer { 

} 

Простой класс конфигурации, чтобы включить веб-безопасности для Spring MVC

@Configuration 
@EnableWebSecurity 
public class SecurityConfig 
    extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 

     http.formLogin().and() 
      .authorizeRequests() 
      .antMatchers("/spitter/").authenticated() 
      .antMatchers(HttpMethod.GET, "/spitter/register").authenticated().and() 

      .logout().deleteCookies("remove") 
      .invalidateHttpSession(true).logoutUrl("/logout") 
      .logoutSuccessUrl("/"); 

    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) 
     throws Exception { 

     auth.inMemoryAuthentication().withUser("user").password("password") 
      .roles("USER").and().withUser("admin").password("password") 
      .roles("USER", "ADMIN"); 
    } 

} 

Контроллер:

@Controller 
@RequestMapping(value = "/spitter") 
public class SpittrController { 

    private SpittleRepository spittleRepository; 

    @Autowired 
    public SpittrController(SpittleRepository spittleRepository) { 

     this.spittleRepository = spittleRepository; 
    } 

    @RequestMapping(value = "/register", method = RequestMethod.GET) 
    public String showRegistrationForm() { 

     return "registerForm"; 
    } 

    @RequestMapping(value = "/register", method = RequestMethod.POST) 
    public String processingRegistration(@Valid Spitter spitter, Errors errors) { 

     if (errors.hasErrors()) { 
      return "registerForm"; 
     } 

     spittleRepository.save(spitter); 
     return "redirect:/spitter/" + spitter.getUserName(); 

    } 

    @RequestMapping(value = "/{username}", method = RequestMethod.GET) 
    public String showSpitterProfile(@PathVariable("username") String username, 
            Model model) { 

     Spitter spitter = spittleRepository.findByUsername(username); 
     if(spitter != null){ 
      model.addAttribute(spitter); 
     } 

     return "profile"; 
    } 
} 

registerForm.jsp:

<form method="post"> 
     <table> 
      <tr> 
       <td>First Name:</td> 
       <td><input type="text" name="firstName" /></td> 
      </tr> 
      <tr> 
       <td>Last Name:</td> 
       <td><input type="text" name="lastName" /></td> 
      </tr> 
      <tr> 
       <td>User Name:</td> 
       <td><input type="text" name="userName" /></td> 
      </tr> 
      <tr> 
       <td>Password:</td> 
       <td><input type="password" name="password" /></td> 
      </tr> 
      <tr> 

       <td><input type="submit" value="Register" /></td> 
      </tr> 
     </table> 
     <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"> 
    </form> 

После подачи registerForm.jsp, то profile.jsp показано пользователю:

profile.jsp:

<body> 
    <h1>Hello world!</h1> 

    <p>The time on the server is ${serverTime}.</p> 

    <h1>Your Profile</h1> 
    <h1><a href="/logout">Logout</a></h1> 


    <table> 
     <tr> 
      <td>First Name:</td> 
      <td><c:out value="${spitter.firstName}" /></td> 
     </tr> 
     <tr> 
      <td>Last Name:</td> 
      <td><c:out value="${spitter.lastName}" /></td> 
     </tr> 
     <tr> 
      <td>User Name:</td> 
      <td><c:out value="${spitter.userName}" /></td> 
     </tr> 
    </table>  
</body> 

Когда я ударил

http://localhost:8080/web/spitter/register

Я перенаправлен на страницу входа. После авторизации и отправки формы, то profile.jsp показано, в котором я включил Выход ссылку. При щелчке на нем HTTP 404.

Я прошел через Spring Security docs, но они приняли thymeleaf во внимание. Моя простая страница JSP.

Кроме того, я также рассмотрел принимая это во внимание,

По запросу POST по умолчанию требуется для выхода из системы URL.Чтобы выполнить выход из системы по запросу GET вам нужно:

HTTP .logout() .logoutRequestMatcher (новый AntPathRequestMatcher ("/ выхода из системы"));

1: http://docs.spring.io/spring-security/site/docs/3.2.x/guides/hellomvc.html

Любые предложения?

+0

'/ logout' как URL или действия в форме будет работать, только если ваше приложение развертывается как корень. Вам нужно включить 'context-root'. Используйте тег URL для этого '' должен делать трюк. –

+0

@Denium: Вы имеете в виду web/spitter/logout. –

+0

Если '/ web/spitter' является корнем контекста вашего приложения, да, иначе нет ... Как указано, используйте тег URL, который делает это для вас. (Как и в ответе, который в основном правильный, но включает неправильный URL). –

ответ

1

Обновление код в profile.jsp, как

<h1><a href="#" onclick="javascript:logoutForm.submit();">logout</a></h1> 

     <c:url var="logoutUrl" value="/logout" /> 
     <form action="${logoutUrl}" method="post" id="logoutForm"> 
      <input type="hidden" name="${_csrf.parameterName}" 
       value="${_csrf.token}" /> 
     </form> 
+1

Хотя этот ответ верен, вы можете немного рассказать о том, почему вы должны это делать, и указать на соответствующие разделы справочного руководства. Также ссылка неверна, она должна быть '/ logout'. –

+0

@Balwinder: Нет, это не помогло. Я получил HTTP-статус 404 -/web/j_spring_security_logout –

+0

@ShirgillAnsari ссылка была неправильной. Только что отредактировал мой ответ. –

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