Как обрабатывать смену пароля при использовании Spring Security

Я был удивлен, как мало я нашел поиск по этой теме. Я использую Spring Security, чтобы разрешить пользователям входить в приложение Spring MVC. Я также использую Hibernate на сервисном уровне для сохранения изменений в базе данных (я храню информацию о пользователе в той же базе данных, которую использую для остальной части приложения). Как я могу в этой среде (используя преимущества Spring Security) позволить пользователю изменить свой пароль?

Это мой spring-security.xml:

    <http auto-config="true" use-expressions="true">
        <intercept-url pattern="/essays/auth/login" access="permitAll"/>
        <intercept-url pattern="/essays/auth/logout" access="permitAll"/>
        <intercept-url pattern="/essays/auth/denied" access="hasRole('ROLE_USER')"/>
        <intercept-url pattern="/" access="hasRole('ROLE_USER')"/>
        /* more intercept urls */

        <form-login login-page="/essays/auth/login"
                    authentication-failure-url="/essays/auth/login?error=true"
                    default-target-url="/essays/main/student/search"
                    always-use-default-target="true"/>

        <access-denied-handler error-page="/essays/auth/denied"/>

        <logout invalidate-session="true"
                logout-success-url="/essays/auth/login"
                logout-url="/essays/auth/logout"/>
    </http>

    <authentication-manager>
        <authentication-provider user-service-ref="customUserDetailsService">
            <password-encoder hash="md5"/>
        </authentication-provider>
    </authentication-manager>

Я реализовал службу пользовательской информации о пользователе:

@Service
@Transactional(readOnly = true)
public class CustomUserDetailsService implements UserDetailsService {

    @Resource
    private UserService userService;

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        try {
            org.jana.domain.User domainUser = userService.getByUsername(username);
            boolean enabled = true;
            boolean accountNonExpired = true;
            boolean credentialsNonExpired = true;
            boolean accountNonLocked = true;
            return new User(
                    domainUser.getUsername(),
                    domainUser.getPassword().toLowerCase(),
                    enabled,
                    accountNonExpired,
                    credentialsNonExpired,
                    accountNonLocked,
                    getAuthorities(domainUser.getRole().getRole()));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
...

А это сервис, который занимается Hibernate:

@Service("userService")
@Transactional
public class UserService {

    @Resource(name="sessionFactory")
    private SessionFactory sessionFactory;

    public User getByUsername(String username) {

        Session session = sessionFactory.getCurrentSession();

        String hql = "FROM User u WHERE u.username = :username";
        Query query = session.createQuery(hql);
        query.setParameter("username", username);
        User user = (User)query.uniqueResult();

        return user;
    }

Я новичок в этом, поэтому любая помощь будет высоко оценена. Спасибо.


person just_a_girl    schedule 22.02.2014    source источник
comment
Нет (обычно) ничего особенного в смене пароля по сравнению с изменением любого другого свойства (например, электронной почты). Spring Security нацелен на аутентификацию и авторизацию. Это просто обновление базы данных.   -  person Pavel Horal    schedule 22.02.2014
comment
так что в весенней безопасности нет функции, которая делает это автоматизированным/упрощенным?   -  person just_a_girl    schedule 22.02.2014
comment
Нет функции, о которой я знаю.   -  person Pavel Horal    schedule 22.02.2014
comment
Безопасность Spring не знает о ваших объектах домена.   -  person gipinani    schedule 22.02.2014


Ответы (1)


Я обрабатываю изменение пароля так же, как изменение любого другого поля сущности.

В этой ситуации вы можете создать форму обновления для гипотетического пользовательского объекта. Когда вы сохраняете свой пользовательский объект в базе данных, вам может потребоваться сохранить хешированный пароль, обрабатывать соль и т. д. Но это не работа по обеспечению безопасности spring.

person gipinani    schedule 22.02.2014
comment
Хорошая мысль о закодированном пароле! Для этого вы должны повторно использовать Spring PasswordEncoder. - person Pavel Horal; 23.02.2014
comment
@PavelHoral Да. Я ввожу его в свой класс обслуживания - person gipinani; 23.02.2014