2016-01-24 77 views
1

的问题是,当我点击提交我得到Spring Security的4:请求方法 'POST' 不支持

Etat HTTP 405 - Request method 'POST' not supported 

这里是控制器:

@RequestMapping(value = "/admin/login", method = RequestMethod.GET) 
public ModelAndView login(
     @RequestParam(value = "error", required = false) String error, 
     @RequestParam(value = "logout", required = false) String logout) { 
    LOGGER.debug("admin login page"); 
    ModelAndView model = new ModelAndView(); 
    if (error != null) { 
     model.addObject("error", "Invalid username and password!"); 
    } 

    if (logout != null) { 
     model.addObject("msg", "You've been logged out successfully."); 
    } 

    model.setViewName("/admin/index"); 
    LOGGER.debug("returning admin login page"); 

    return model; 
} 

而且形式:

<form class="m-t" role="form" th:action="@{/admin/login}" method="POST" autocomplete="off"> 
    <div th:if="${param.error}" class="alert alert-danger">Invalid username and password.</div> 
    <div th:if="${param.logout}" class="alert alert-success">You have been logged out.</div> 
    <div class="form-group"> 
     <input type="text" class="form-control" id="username" name="username" placeholder="Username" required="" /> 
    </div> 
    <div class="form-group"> 
     <input type="password" class="form-control" id="username" name="username" placeholder="Username" required="" /> 
    </div> 
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> 
    <button type="submit" class="btn btn-primary block full-width m-b">Login</button> 
    <a href="#"><small>Forgot password?</small></a> 
    <p class="text-muted text-center"> 
     <small>Do not have an account?</small> 
    </p> 
    <a class="btn btn-sm btn-white btn-block" href="register.html">Create an account</a> 
</form> 

看起来像csrf字段不工作。

我解释,我有正常的用户网站,通过我这里指和管理部分是/管理

登录表单显示正确。但我当我点击提交我得到Etat HTTP 405 - Request method 'POST' not supported

任何想法请吗?

这里是我的安全配置类:

package com.mintad.spring.security; 

import javax.sql.DataSource; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
import org.springframework.security.core.userdetails.UserDetailsService; 

/** 
* @author Sofiane HAMMAMI 
*/ 
@Configuration 
@EnableWebSecurity 
@ComponentScan 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Autowired 
    DataSource dataSource; 

    @Autowired 
    @Qualifier("customUserDetailsService") 
    UserDetailsService userDetailsService; 

    @Autowired 
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(userDetailsService); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
      .antMatchers("/", "/home").permitAll() 
      .antMatchers("/admin/**").permitAll() 
//   .antMatchers("/admin/**").access("hasRole('ADMIN')") 
      .and().formLogin().loginPage("/login") 
      .defaultSuccessUrl("/welcome").usernameParameter("username").passwordParameter("password") 
      .and().exceptionHandling().accessDeniedPage("/404"); 
    } 
} 

回答

1

在控制器,您将表单定义为GET

@RequestMapping(value = "/admin/login", method = RequestMethod.GET) 

和在形式上,你在呼唤它为POST

form class="m-t" role="form" th:action="@{/admin/login}" method="POST" 

变化的其中之一,无论是在控制器或形式。

如果你想控制人变更,以取代现有的行:

@RequestMapping(value = "/admin/login", method = RequestMethod.POST) 

,或者你可以通过修改通话从形式做到像

form class="m-t" role="form" th:action="@{/admin/login}" method="GET" 
+0

谢谢@Sidhu ..真遗憾,我没有看到.. – Sofiane

1

原因你405,你想提交与HTTP POST方法的形式和定义的HTTP GET方法终点。

你需要改变你的请求映射到方法POST像:

@RequestMapping(value = "/admin/login", method = RequestMethod.POST) 

或者你可以在你的形式做反之亦然(我不会推荐),如:

<form class="m-t" role="form" th:action="@{/admin/login}" method="GET" autocomplete="off"> 
+0

谢谢@SMA。这是解决方案:) – Sofiane

+0

我不明白这个@Sofiane同样的答案被Sidhu重复了一小时后我写的,你接受了被复制的一个小时? – SMA

+0

当我打开最旧的标签时,sidhu答案首先出现。我无法在你的答案或sidhu上看到任何日期。 – Sofiane

1

更改您的安全配置使用/admin/login作为您的登录页面:

... 
.formLogin().loginPage("/admin/login") 
+0

此登录页面不会被更改,因为它将用于正常的网站部分。 – Sofiane

+0

然后发布到'/ login'端点,而不是'/ admin/login' –

相关问题