java - Spring登录表单示例

标签 java hibernate spring-mvc spring-security

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

简而言之,我如何使用 Spring 和 Hibernate 创建一个简单的登录表单,并使用数据库检查凭据。

更新

任何人都想出一个简单的例子,我可以看到流程是如何进行的,以及输入数据是如何传递给 hibernate 的?

最佳答案

首先你应该定义这个文件WEB-INF/spring/serurity-context.xml:

<beans:beans xmlns="http://www.springframework.org/schema/security"
             xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                                 http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">

    <http auto-config="true" />

    <beans:bean id="myUserService" class="org.my.UserService" />
    <authentication-provider user-service-ref="myUserService" />

</beans:beans>

现在您应该创建 org.my.UserService 类并实现接口(interface) org.springframework.security.core.userdetails.UserDetailsS​​ervice。这个接口(interface)有一个方法:

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

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

现在是 web.xml:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">

    <display-name>My Webapp</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring/*-context.xml
        </param-value>
    </context-param>

    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

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

PS:因此,使用 UserDetailsS​​ervice,您不必检查用户帐户是否处于 Activity 状态等的密码。您只需提供有关用户的 spring-security 信息,并提供 userName 和框架验证用户本身。例如,如果您使用 MD5 对密码进行编码,则可以像这样使用 password-encoder:

<beans:bean id="myUserService" class="org.my.UserService" />
<authentication-provider user-service-ref="myUserService">
    <password-encoder hash="md5"/>
</authentication-provider>

更新

现在我们将更深入地研究 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<GrantedAuthority> roles = new ArrayList<GrantedAuthority>();
            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

关于java - Spring登录表单示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4613678/

相关文章:

SortedArrayList 中的 Java.lang.AssertionError

java - 如何在 .java 代码中启用禁用的(在 xml 中)ListPreference 对象?

hibernate - Spring Boot 2.x 的性能问题?

java - Spring race conditions 单例服务有状态还是无状态

javascript - AngularJs 表单发布数据在我的 spring Controller 中给出空值

java - 打开文件 gdal java 时出错

java - 如何在Java中将复杂的字符串转换为列表/数组?

javax.persistence.RollbackException : Error while committing the transaction in JPA code

java - hibernate : delete is not valid without active transaction

java - 如何在 Spring 中找到当前 webapp 的基本 URL?