2016-10-16 2 views
1

Ich habe Fehler Login aus dem HTML mit Spring Security, Spring MVC und JPA.Spring Security/MVC/JPA -> Anfrage Methode 'POST' nicht unterstützt

Das ist mein 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>

Diese WebSecurity Klasse ist:

@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 Serviceklasse:

@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); 
    } 
} 

} 

Ich habe immer Fehler 405:

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

Irgendwelche Ideen, warum nicht das ruft "configure (HttpSecurity http)". Fehle ich etwas?

Vielen Dank

Andres

Antwort

0

Try

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

Zusätzlich

Ein typischer Grund in Spring MVC-Anwendungen für Controller-Methoden und Seiten nicht gefunden ist das Hinzufügen Spring seltsam Mapping Konvention zum Erstellen von URLs durch Hinzufügen eines neuen Links (oder der Form action = "x") zum Ende der aktuellen URL. 'Request-Methode POST Not Supported' bedeutet nur, dass Ihre Anfrage irgendwo hingeht, wo nichts die POST-Anfrage akzeptiert => URL-Mapping schlägt fehl. Auf JSP-Sites sollten Sie immer URLs angeben wie

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

oder mit JSTL

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

Dann können Sie sicher sein, dass Sie Ihren Link in URL direkt nach der Anwendung Wurzel gesetzt. Dies wird Sie in Zukunft vor vielen unnötigen Problemen bewahren.

+0

Vielen Dank für die schnelle Ruhe @micaro, ich habe das Formular in

und es den Beitrag finden und die DB abfragen. Aber mein Problem ist jetzt die Rückkehr des Beitrags: "http: // localhost: 8080/Login? Fehler". Bedeutet es, als es die Benutzerdetails nicht abrufen konnte oder sie nicht korrekt sind? –

+0

failureUrl ist normalerweise dieselbe Seite wie die Anmeldeseite. Mit dem Login-Fehler können Sie der Ansicht eine Art Fehlermeldung hinzufügen, wenn ein Benutzer einen falschen Benutzernamen oder ein falsches Passwort eingibt. failureUrl kann nur angemeldet werden, wenn Sie keine Nachricht hinzufügen möchten. – micaro

+1

Wenn Sie am Ende zu failureUrl ging etwas falsch mit der Authentifizierung. Dafür gibt es eine Menge Gründe. – micaro

Verwandte Themen