【问题标题】:How to handle password change when using Spring Security使用 Spring Security 时如何处理密码更改
【发布时间】:2014-03-24 10:02:49
【问题描述】:

我很惊讶我发现在这个主题上的搜索很少。我正在使用 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;
    }

我是新来的,所以任何帮助都将不胜感激。谢谢。

【问题讨论】:

  • 通过更改任何其他属性(例如电子邮件)来更改密码(通常)并没有什么特别之处。 Spring Security 的目标是身份验证和授权。这只是一个数据库更新。
  • 所以 Spring Security 中没有任何功能可以让这个自动化/更容易?
  • 没有我知道的功能。
  • Spring security 不知道你的域对象..

标签: hibernate spring-mvc spring-security change-password


【解决方案1】:

我处理密码修改就像修改任何其他实体字段一样。

在这种情况下,您可以为 hipotetic 用户对象创建更新表单。当您将用户实体保存在数据库中时,您可能需要保存散列密码、处理盐等。但这不是弹簧安全工作。

【讨论】:

  • 关于编码密码的要点!您应该为此重新使用 Spring 的 PasswordEncoder
  • @PavelHoral 是的。我将它注入到我的服务类中
猜你喜欢
  • 2014-09-13
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 2013-03-21
  • 2018-01-15
  • 2013-02-12
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多