Spring登录表单示例

我尝试在谷歌搜索,但我找不到任何好的例子,其中用数据库检查用户名和密码以进行身份​​validation。

换句话说,如何使用Spring和Hibernate创建一个简单的登录表单,其中使用数据库检查凭据。

更新

Cam有没有想出一个简单的例子,我可以看到流程如何以及输入数据如何传递给hibernate?

首先,您应该定义此文件WEB-INF/spring/serurity-context.xml

      

现在,您应该创建org.my.UserService类并实现接口org.springframework.security.core.userdetails.UserDetailsService 。 这个接口有一个方法:

 UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, org.springframework.dao.DataAccessException 

在这种方法中,您可以使用Hibernate来按用户名加载用户。 如果用户不存在 – 只需抛出UsernameNotFoundException,否则返回新的初始化UserDetails实例(在那里​​你可以提供很多东西,比如用户角色,帐号到期日等等)。

现在来了web.xml

  My Webapp  contextConfigLocation  /WEB-INF/spring/*-context.xml    springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /*   org.springframework.web.context.ContextLoaderListener   dispatcher org.springframework.web.servlet.DispatcherServlet 1   dispatcher /*   

如果您有任何问题或出现问题,请随时问:)

PS:因此,使用UserDetailsS​​ervice,您无需检查用户帐户是否处于活动状态等密码。您只需提供有关用户提供的用户名的弹性安全信息,框架将validation用户自身。 例如,如果使用MD5对password-encoder ,则可以使用password-encoder如下所示:

     

更新

现在我们将更深入地了解UserService – 我的(简化)现实世界的例子。

UserService类:

 import org.my_company.my_app.domain.User public class UserService implements UserDetailsService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { // load user User user = userDao.getUser(username); if (user != null) { // convert roles List roles = new ArrayList(); for (Privilege p : user.getPrivileges()) { roles.add(new GrantedAuthorityImpl(p.getName())); } // initialize user SecurityUser securityUser = new SecurityUser( user.getUsername(), user.getLdapAuth() ? getLdapPassword(user.getUsername()) : user.getPassword(), user.getStatus() != User.Status.NOT_COMMITED, user.getStatus() != User.Status.BLOCKED, true, true, roles.toArray(new GrantedAuthority[0]) ); securityUser.setUser(user); return securityUser; } else { throw new UsernameNotFoundException("No user with username '" + username + "' found!"); } } } 

现在SecurityUser

 import org.my_company.my_app.domain.User public class SecurityUser extends org.springframework.security.core.userdetails.User { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public SecurityUser(String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, GrantedAuthority[] authorities) throws IllegalArgumentException { super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); } } 

最后UserDao

 import org.my_company.my_app.domain.User public class UserDao extends HibernateDaoSupport { public User getUser(String username) { List users = getHibernateTemplate().find("from User where username = ?", username); return users == null || users.size() <= 0 ? null : (User) users.get(0); } } 

如您所见,我在这里使用了HibernateTemplate

您可以在此处转到Spring登录表单示例: http : //www.roseindia.net/spring/spring-mvc-login-example.shtml 。

您可以在“Easy Angle”的post中看到基本的xml配置。 他提到的“myUserService”部分是一个实现“UserDetailService”的bean,那个基本上只有一个方法可以实现,如下所示:

 public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException, DataAccessException 

如果你使用Spring,那么你可能会有一个Bean来处理对用户表的访问。 您可以注入该类以检索用户详细信息,例如:

  @Override public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException, DataAccessException { UserTable user = userbean.getUserbyName(name); if (user == null) { throw new UsernameNotFoundException("User " + name + " not found!"); } Collection auth = getAuthorities(user.getAuthorities()); return new User(user.getName(), user.getPassword(), true, true, true, true, auth); } 

现在在身份validationbean中,您只需要注入此bean并向其询问UserDetails。 在那里,您可以使用它来检查凭据是否正确,如果是这样,请使用所需信息填充SecurityContext以便登录。

  @Override public Boolean authenticate(String username, String password) { UserDetails userdetail = null; try { userdetail = myUserService.loadUserByUsername(username); } catch (UsernameNotFoundException e) { return false; } catch (DataAccessException e) { return false; } if (!myUserService.encodePassword(password).equals(userdetail.getPassword())) { return false; } Authentication auth = new UsernamePasswordAuthenticationToken(userdetail.getUsername(), userdetail.getPassword(), userdetail.getAuthorities()); SecurityContext sc = new SecurityContextImpl(); ServletRequestAttributes attr = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes(); attr.getRequest().getSession().setAttribute(UsernamePasswordAuthenticationFilter.SPRING_SECURITY_LAST_USERNAME_KEY, userdetail.getUsername()); sc.setAuthentication(auth); SecurityContextHolder.setContext(sc); return true; } 

当然那是真实版本的简化版本。 在说用户进行身份validation之前,您必须执行更多检查(例如,SQLInjection)

App-fuse将为您提供一个完整的工作示例: http : //appfuse.org/display/APF/AppFuse+QuickStart

或者,如果你安装了maven,只需运行:

 mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-light-spring-security-archetype -DarchetypeVersion=2.1.0-M2 -DgroupId=com.mycompany -DartifactId=myproject 

这将生成一个带有spring mvc,spring security和hibernate的appfuse light项目。

如果您使用的是可以使用JDBC访问的数据库,则无需创建自定义身份validation提供程序。 身份validation提供程序已允许您直接查询数据库。 它将所需的代码减少到9行XML而不是多个类。

我在这里用代码示例回答了这个问题: 使用Hibernate进行Spring Security 3数据库身份validation

以下链接将精确地为您提供所需的信息。 有一个登录页面接受用户ID和密码。 密码以纯文本forms存储,因为它只是一个测试项目。 使用的数据库是MySQL。 您可以从下面链接查看步骤,下载代码和war文件。 如果您在运行应用程序时遇到任何问题,请告诉我们。 希望能帮助到你! http://badalchowdhary.wordpress.com/2012/02/26/spring-hibernate-integration/