2016-10-16 28 views
1

У меня возникают ошибки входа в систему из HTML с помощью Spring Security, Spring MVC и JPA.Spring Security/MVC/JPA -> Метод запроса «POST» не поддерживается

Это мой login.html

<!DOCTYPE html> 
 
<html xmlns:th="http://www.thymeleaf.org"> 
 
<head lang="en" xmlns:th="http://www.thymeleaf.org">> 
 
    <title>Spring Framework Guru</title> 
 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
 
</head> 
 
<body class="security-app"> 
 
<div class="details"> 
 
    <h2>Spring Security - App</h2> 
 
</div> 
 

 
<form action="/login" method="post"> 
 

 
    <div class="lc-block"> 
 
     <div> 
 
      <input type="text" class="style-4" name="username" 
 
        placeholder="User Name" /> 
 
     </div> 
 
     <div> 
 
      <input type="password" class="style-4" name="password" 
 
        placeholder="Password" /> 
 
     </div> 
 
     <div> 
 
      <input type="submit" value="Sign In" class="button red small" /> 
 
     </div> 
 
     <th:if test="${param.error ne null}"> 
 
      <div class="alert-danger">Invalid username and password.</div> 
 
     </th:if> 
 
     <th:if test="${param.logout ne null}"> 
 
      <div class="alert-normal">You have been logged out.</div> 
 
     </th:if> 
 
    </div> 
 
    <input type="hidden" name="${_csrf.parameterName}" 
 
      value="${_csrf.token}" /> 
 
</form> 
 

 
</body> 
 
</html>

Это WebSecurity класс:

@Configuration 
@EnableWebSecurity 
@ComponentScan(basePackageClasses = CustomUserDetailsService.class) 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

@Autowired 
private UserDetailsService userDetailsService; 

@Autowired 
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception { 
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordencoder()); 
} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http.authorizeRequests() 
      .antMatchers("/hello").access("hasRole('ROLE_ADMIN')") 
      .anyRequest().permitAll() 
      .and() 
      .formLogin().loginPage("/login") 
      .usernameParameter("username").passwordParameter("password") 
      .and() 
      .logout().logoutSuccessUrl("/login?logout") 
      .and() 
      .exceptionHandling().accessDeniedPage("/403") 
      .and() 
      .csrf(); 
} 

@Bean(name = "passwordEncoder") 
public PasswordEncoder passwordencoder() { 
    return new BCryptPasswordEncoder(); 
} 
} 

UserDetails класса обслуживания:

@Service("customUserDetailsService") 
public class CustomUserDetailsService implements UserDetailsService { 
private final UserRepository userRepository; 
private final UserRolesRepository userRolesRepository; 

@Autowired 
public CustomUserDetailsService(UserRepository userRepository, UserRolesRepository userRolesRepository) { 
    this.userRepository = userRepository; 
    this.userRolesRepository = userRolesRepository; 
} 


@Override 
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
    User user = userRepository.findByUserName(username); 
    if (null == user) { 
     throw new UsernameNotFoundException("No user present with username: " + username); 
    } else { 
     List<String> userRoles = userRolesRepository.findRoleByUserName(username); 
     return new CustomUserDetails(user, userRoles); 
    } 
} 

} 

У меня всегда есть 405 ошибка:

2016-10-16 12:15:30.710 WARN 2932 --- [nio-8080-exec-3] o.s.web.servlet.PageNotFound : Request method 'POST' not supported

Любые идеи, почему не созывающие "Configure (HttpSecurity HTTP)". Я что-то упускаю?

Большое спасибо

Andres

ответ

0

Попробуйте добавить

.formLogin().loginPage("/xxx").permitAll() 
       .defaultSuccessUrl("/xxx") 
       .failureUrl("/xxx?error") 

В дополнение

Одна из типичных причин в Spring MVC приложений для методов контроллеров и страниц не найдено странно отображение в Spring соглашение для создания URL-адресов путем добавления новой ссылки (или формы action = "x") в конец текущего URL-адреса. «Метод запроса POST не поддерживается» означает, что ваш запрос указывается где-то, где ничто не принимает запрос POST => Невозможно сопоставление URL-адресов. На сайтах JSP вы должны всегда указывать URL-адреса, как

<form action="${pageContext.request.contextPath}/login" method="post"> 

или с JSTL

<c:url value="/login" var="loginUrl" /> 
<form action="${loginUrl}" method="post"> 

Тогда вы можете быть уверены, что ваша ссылка устанавливается сразу после корня приложения в URL. Это избавит вас от множества ненужных проблем в будущем.

+0

Большое спасибо за быстрый отдых @micaro, я изменил форму на

и нашел сообщение и запросил БД. Но теперь моя проблема заключается в возврате сообщения: «http: // localhost: 8080/login? Error». Означает ли это, что он не мог получить данные пользователя или они неверны? –

+0

failureUrl обычно является той же страницей, что и страница входа в систему. С помощью ошибки входа в систему вы можете добавить какое-то сообщение об ошибке в представление, если пользователь вводит неправильное имя пользователя или пароль. failureUrl может просто быть логином, если вы не хотите добавлять какие-либо сообщения. – micaro

+1

Если вы закончите сбой failUrl, что-то пошло не так с проверкой подлинности. Для этого существует огромное количество причин. – micaro

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