2014-04-03 115 views
0

我试图让我的手在Spring启动时与休眠和Spring-Security相关。我在尝试使用spring-security进行登录时遇到困难,并且发现很难用一些奇怪的问题进行调试。使用Hibernate进行Spring-Security登录返回错误的凭证

我的代码从我称之为“userDAO.getUser(login)”的地方输入“loadUserByUsername(String login)”。在getUser(登录)我已经打印日志,这些日志在createQuery代码行之后没有打印,并且在登录界面的UI上收到“Bad credentials”消息。

以下是获得打印的日志: -

2014年4月3日22:38:54.150 INFO 4587 [Tomcat的HTTP - 6] --- service.CustomUserDetailsS​​ervice:XXX loadUserByUsername

2014年4月3日22:38:54.151 INFO 4587 [Tomcat的HTTP - 6] --- model.implementation.UserDAOImpl:XXX登录名:-admin

2014年4月3日22: 38:54.152 INFO 4587 [tomcat-http - 6] --- model.implementation.UserDAOImpl :XXX用户Query0 2014-04-03

我不明白为什么其他日志下面这个不打印,以及如何我的代码移出的方法没有任何错误日志。

您还可以在https://github.com/himanshuvirmani/Spring-Boot-Security-Example

某些代码段检查以下

@Override 
    public UserDetails loadUserByUsername(String login) 
      throws UsernameNotFoundException { 
     logger.info("XXX loadUserByUsername"); 
     AdminUser domainUser = userDAO.getUser(login); 

     boolean enabled = true; 
     boolean accountNonExpired = true; 
     boolean credentialsNonExpired = true; 
     boolean accountNonLocked = true; 
     logger.info("XXX User name " + domainUser.getLogin()); 
     logger.info("XXX User Role " + domainUser.getRole().getRole()); 
     return new User(
       domainUser.getLogin(), 
       domainUser.getPassword(), 
       enabled, 
       accountNonExpired, 
       credentialsNonExpired, 
       accountNonLocked, 
       getAuthorities(domainUser.getRole().getId()) 
     ); 
    } 


public AdminUser getUser(String login) { 
     logger.info("XXX Login name : -" + login); 
     List<AdminUser> userList = new ArrayList<AdminUser>(); 
     logger.info("XXX User Query0 "); 
     Query query = openSession().createQuery("from AdminUser u where u.login = :login"); 
     logger.info("XXX User Query1 "); 
     query.setParameter("login", login); 
     logger.info("XXX User Query2 : -"); 
     userList = query.list();   
     if (userList.size() > 0) 
      return userList.get(0); 
     else 
      return null;  
    } 
+0

你确定你没有得到任何异常? HQL查询应为 'from AdminUser u where u.login =:login'。这可能会解释为什么其他日志消息不能打印。 – Michal

+0

是的,我的坏..但改变到AdminUser也没有影响。尽管如此,它仍然只能在该查询上结束代码。我已经使用下面的logback.xml配置了Hibernate日志。我是否需要做额外的事情来查看从休眠状态中的异常等。 –

+0

\t \t

回答

1

感谢的完整代码的所有帮助。我找出了问题并在下面提及,以便在有人面临此问题时可能会有所帮助。

这里hibernate的createQuery方法抛出异常,但是同样的异常不会出现在控制台或弹簧日志中。因此,最好使用try/catch来捕获所有的hibernate查询语句,以便您始终知道是否发生了不好的事情。它应该像下面这样: -

public AdminUser getUser(String login) { 
    List<AdminUser> userList = new ArrayList<AdminUser>(); 
    try { 
    Query query = openSession().createQuery("FROM model.AdminUser u WHERE u.login = :login");  
    query.setParameter("login", login); 
    logger.debug("XXX query : -" + query.getQueryString()); 
    userList = query.list(); 
    } catch(HibernateException e){ 
     logger.error("XXX Hibernate exception occured"); 
     e.printStackTrace(); 
    }