2017-03-07 97 views
-2

我试图在Spring Security中使用Annotations来执行数据库身份验证。 当我尝试登录时,它一直显示无效的用户名和密码,我很确定我从数据库(postgresql数据库)提交正确的用户名和密码。Spring Security 4.X无效的用户名


的Login.jsp

<h1>Spring Security Login Form (Database Authentication)</h1> 

    <div id="login-box"> 

     <h3>Login with Username and Password</h3> 

     <c:if test="${not empty error}"> 
      <div class="error">${error}</div> 
     </c:if> 
     <c:if test="${not empty msg}"> 
      <div class="msg">${msg}</div> 
     </c:if> 

     <form name='loginForm' 
      action="<c:url value='/login' />" method='POST'> 

      <table> 
       <tr> 
        <td>User:</td> 
        <td><input type='text' name='username'></td> 
       </tr> 
       <tr> 
        <td>Password:</td> 
        <td><input type='password' name='password' /></td> 
       </tr> 
       <tr> 
        <td colspan='2'><input name="submit" type="submit" 
         value="submit" /></td> 
       </tr> 
      </table> 

      <input type="hidden" name="${_csrf.parameterName}" 
       value="${_csrf.token}" /> 

     </form> 
    </div> 

</body> 

MainController:

@Controller 
public class MainController { 

    @RequestMapping(value = { "/", "/welcome**" }, method = RequestMethod.GET) 
    public ModelAndView defaultPage() { 

     ModelAndView model = new ModelAndView(); 
     model.addObject("title", "Spring Security Login Form - Database Authentication"); 
     model.addObject("message", "This is default page!"); 
     model.setViewName("hello"); 
     return model; 

    } 

    @RequestMapping(value = "/admin**", method = RequestMethod.GET) 
    public ModelAndView adminPage() { 

     ModelAndView model = new ModelAndView(); 
     model.addObject("title", "Spring Security Login Form - Database Authentication"); 
     model.addObject("message", "This page is for ROLE_ADMIN only!"); 
     model.setViewName("admin"); 

     return model; 

    } 

    @RequestMapping(value = "/login", method = RequestMethod.GET) 
    public ModelAndView login(@RequestParam(value = "error", required = false) String error, 
      @RequestParam(value = "logout", required = false) String logout) { 
     System.out.println("d5alt MainController ModelAndView method login"); 

     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("login"); 


     return model; 

    } 

    //for 403 access denied page 
    @RequestMapping(value = "/403", method = RequestMethod.GET) 
    public ModelAndView accesssDenied() { 

     ModelAndView model = new ModelAndView(); 

     //check if user is login 
     Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
     if (!(auth instanceof AnonymousAuthenticationToken)) { 
      UserDetails userDetail = (UserDetails) auth.getPrincipal(); 
      System.out.println(userDetail); 

      model.addObject("username", userDetail.getUsername()); 


     } 

     model.setViewName("403"); 
     return model; 

    } 

} 

SecurityConfig:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    DataSource dataSource; 

    @Autowired 
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception { 

     auth.jdbcAuthentication().dataSource(dataSource) 
      .usersByUsernameQuery("select nameEntiteUser,psw, enabled from vm_entiteuser where nameEntiteUser=?") 
      .authoritiesByUsernameQuery("select e.nameEntiteUser as username, u.role as role from vm_role u ,vm_entiteuser e where e.nameEntiteUser = ?"); 

     } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
      .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") 
      .and() 
       .formLogin().loginPage("/login").failureUrl("/login?error") 
        .usernameParameter("login").passwordParameter("psw") 
      .and() 
       .logout().logoutSuccessUrl("/login?logout") 
      .and() 
       .exceptionHandling().accessDeniedPage("/403") 
      .and() 
       .csrf(); 

    } 
} 

回答

0

我解决了这个问题,我的参数配置方法不正确:

protected void configure(HttpSecurity http) throws Exception { 
    http.authorizeRequests() 
     .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") 
     .and() 
      .formLogin().loginPage("/login").failureUrl("/login?error") 
       .usernameParameter("username").passwordParameter("password") 
     .and() 
      .logout().logoutSuccessUrl("/login?logout") 
     .and() 
      .exceptionHandling().accessDeniedPage("/403") 
     .and() 
      .csrf(); 

}