Смена пароля с помощью Spring Security

Я использую,

Spring Framework 4.0.0 RELEASE (GA)Spring Security 3.2.0 RELEASE (GA)Struts 2.3.16

в котором я использую,

org.springframework.security.authentication.dao.DaoAuthenticationProvider

для аутентификации. мойspring-security.xml Файл выглядит следующим образом.




    

    
        
            
        

        

        
            
            
            
            
             
        

        

        
        
    

    

    
        
        
    

    
        
            
                
            
        
    

    
                    
    

    
    

    
        
    

РеализацияUserDetailsService как следует.

@Service(value="userDetailsService")
public final class UserDetailsImpl implements UserDetailsService {

    @Autowired
    private final transient UserService userService = null;
    @Autowired
    private final transient AssemblerService assemblerService = null;

    @Override
    @Transactional(readOnly = true, propagation = Propagation.REQUIRED)
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
        UserTable userTable = userService.findUserByName(userName);

        if (userTable == null) {
            throw new UsernameNotFoundException("User name not found.");
        } else if (!userTable.getEnabled()) {
            throw new DisabledException("The user is disabled.");
        } else if (!userTable.getVarified()) {
            throw new LockedException("The user is locked.");
        }

        //Password expiration and other things may also be implemented as and when required.
        return assemblerService.buildUserFromUserEntity(userTable);
    }
}

А следующее - это вспомогательный сервис, который преобразует пользовательский объект, который должен использоваться SpringUser объект.

@Service(value="assembler")
@Transactional(readOnly = true, propagation=Propagation.REQUIRED)
public final class AssemblerDAO implements AssemblerService {

    @Override
    public User buildUserFromUserEntity(UserTable userTable) {
        String username = userTable.getEmailId();
        String password = userTable.getPassword();
        boolean active = userTable.getEnabled();
        boolean enabled = active;
        boolean accountNonExpired = active;
        boolean credentialsNonExpired = active;
        boolean accountNonLocked = userTable.getVarified();
        Collection authorities = new ArrayList();

        for (UserRoles role : userTable.getUserRolesSet()) {
            authorities.add(new SimpleGrantedAuthority(role.getAuthority()));
        }

        return new User(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
    }
}

Нет необходимости ссылаться на эти классы.

Мой вопрос заключается в том, что при использовании,

org.springframework.security.provisioning.JdbcUserDetailsManager

UserDetailsManager может быть введен в контроллер и его

public void changePassword(String oldPassword, String newPassword) throws AuthenticationException {
    //...
}

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


    
    

и в контроллере его следует вводить следующим образом.

@Autowired
@Qualifier("jdbcUserService")
public UserDetailsManager userDetailsManager;

Есть ли какая-либо возможность, предоставляемая Spring security в подходе I?Я использую или просто мой собственный метод в DAO для изменения пароля текущего вошедшего в систему пользователя достаточно? Пожалуйста, предложите, если яя делаю что-то не так в любом месте!

Это содержание может быть слишком большим, чтобы ответить на этот вопрос, но яЯ спрашиваю об этом, потому что это нечто довольно экспериментальное.

Ответы на вопрос(2)

Обратите внимание, что, позвонив в SpringJdbcUserDetailsManager.changePassword()Spring обновляет держатель контекста, а также обновляет базу данных новым паролем.

Spring не обрабатывает cookie, поскольку не заставляет ваше приложение быть веб-приложением. так что я думаю, что в этом случае слой более высокого уровня в вашем приложении должен обновить сеанс.

PS - из любопытства - как вы реализовали процесс регистрации, забыли пароль и т. Д.? Весна тоже не справляется.Я написал проект, который заботится из этих потоков ...

поскольку в весенней безопасности для этого нет специальных функций.

Причина, по которой в весенней безопасности не существует никакой специальной функциональности, заключается в том, чтоне требуется при использовании сеанса.

Пользователь'текущий сеанс, идентифицированный cookie-файлом JSESSIONID, все еще находится у пользователяs браузер и все еще будет действительным сеансом после смены пароля.

Когда старый пароль проверялся в последний раз, когда пользователь входил в систему, генерировался файл cookie, который сохранялся в карте действительных файлов cookie в памяти.

Временный токен аутентификации (cookie) все еще действителен и имеет макс. время жизни и изменение пароля в базе данных не повлияет на текущую сессию.

Ваш ответ на вопрос