Spring пример формы входа в систему

Я попытался выполнить поиск в Google, но не нашел хороших примеров, когда имя пользователя и пароль проверяются с помощью базы данных для целей аутентификации.

В следующих простых словах, как я могу создать простую форму входа с помощью Spring и Hibernate, где учетные данные проверяются с помощью базы данных.

Обновление

Какому-нибудь придумать простой пример, где я вижу, как идет поток и как входные данные передаются в спящий режим?

Ответ 1

Сначала вы должны определить этот файл 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 и реализовать интерфейс org.springframework.security.core.userdetails.UserDetailsService. Этот интерфейс имеет один метод:

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: Таким образом, с UserDetailsService вам не нужно проверять пароль, является ли активна учетная запись пользователя и т.д. Вы просто предоставляете spring информацию о безопасности пользователя с предоставленным userName, а среда проверяет сам пользователь. Если вы, например, кодируете свои пароли с помощью MD5, вы можете использовать password-encoder следующим образом:

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

Update

Теперь мы погрузимся более глубоко в 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 здесь.

Ответ 3

Основная xml-конфигурация, которую вы можете увидеть в сообщении "Easy Angle". Часть, которую он упомянул как "myUserService", - это bean, который реализует "UserDetailService" У этого в принципе есть только один способ реализации, который является следующим

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<GrantedAuthority> auth = getAuthorities(user.getAuthorities());
        return new User(user.getName(), user.getPassword(), true, true, true, true, auth);
    }

Теперь в аутентификации bean вам нужно всего лишь ввести этот 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;
    }

Конечно, это упрощенная версия реального. Есть еще несколько проверок, которые вы должны выполнить, прежде чем сказать, что пользователь аутентифицирован (например, SQLInjection)

Ответ 4

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

Это приведет к созданию проекта light light appfuse с помощью spring mvc, spring безопасности и спящего режима.

Ответ 5

Если вы используете базу данных, к которой можно получить доступ с помощью JDBC, вам не нужно создавать собственный поставщик аутентификации. Поставщик проверки подлинности уже позволяет напрямую запрашивать базу данных. Он уменьшит требуемый код до 9 строк XML вместо множества классов.

Я ответил на это здесь с помощью образцов кода: Spring Проверка подлинности базы данных безопасности 3 с помощью Hibernate

Ответ 6

Ниже ссылка точно даст вам то, что вы ищете. Существует страница входа, которая принимает идентификатор пользователя и пароль. Пароль хранится в виде простого текста, так как это всего лишь тестовый проект. В базе данных используется MySQL. Вы можете проверить шаги, загрузить код и файл войны из ниже ссылки. Сообщите мне, есть ли у вас проблемы с запуском приложения. Надеюсь, поможет! http://badalchowdhary.wordpress.com/2012/02/26/spring-hibernate-integration/

Ответ 7

Эй, вот ссылка на мой репозиторий GIT. Я создал простую форму входа в систему, которая проверяет имя пользователя и пароль с помощью SPring-MVC и Spring-JDBC.

https://github.com/gauravbhagat619/LoginCrud.git