2014-02-22 31 views
0

我很驚訝,我發現在這個主題上搜索很少。我使用Spring Security來允許用戶登錄到Spring MVC應用程序。我還在服務層中使用Hibernate來保存對數據庫的更改(我將用戶信息保留在我用於應用程序其餘部分的同一個數據庫中)。在這種環境下(使用Spring Security的優點)我怎麼能夠讓用戶更改自己的密碼?如何在使用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; 
    } 

我新的這個,所以任何幫助將不勝感激。謝謝。

+0

對於通過更改任何其他屬性(例如電子郵件)來更改密碼通常沒有什麼特別之處。 Spring Security旨在驗證和授權。這只是一個數據庫更新。 –

+0

所以在彈簧安全性中沒有使這種自動/簡單的功能? –

+0

沒有我知道的功能。 –

回答

3

我處理密碼修改,如修改任何其他實體字段。

在這種情況下,您可以創建一個hipotetic用戶對象的更新表單。當你將你的用戶實體保存在數據庫中時,你可能需要保存散列密碼,處理鹽等。但這不是一項春季安全工作。

+1

關於編碼passowrd的好處!你應該重新使用Spring的'PasswordEncoder'。 –

+0

@PavelHoral是的。我將它注入我的服務課程 – gipinani

相關問題