Вопрос по spring, spring-4, change-password, spring-security, struts2 – Смена пароля с помощью Spring Security

1

Я использую,

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   ответа
1

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

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

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

1

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

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

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

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

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

Похожие вопросы