2014-02-22 5 views
0

이 주제에 대한 검색이 거의 발견되지 않은 것에 놀랐습니다. 저는 Spring Security를 ​​사용하여 사용자가 Spring MVC 응용 프로그램에 로그인 할 수있게했습니다. 또한 서비스 레이어에서 최대 절전 모드를 사용하여 db에 대한 변경 사항을 유지합니다 (응용 프로그램의 나머지 부분에서 사용하는 것과 동일한 db에 사용자 정보를 유지합니다). 이 환경 (스프링 보안의 장점 사용)에서 어떻게 사용자가 자신의 비밀번호를 변경할 수 있습니까? 스프링 보안을 사용할 때 비밀번호 변경을 처리하는 방법

은 내 spring-security.xml :

@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); 
     } 
    } 
... 

그리고이 최대 절전 모드 다루는 서비스 :

@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; 
    } 

난 내가 정의 사용자 정보 서비스를 구현

<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> 

이것에 새로운 어떤 도움든지 다량 평가 될 것이다. 고맙습니다.

+0

비밀 번호를 변경하여 다른 속성 (예 : 이메일)을 변경하는 데 특별한 것은 없습니다. 스프링 시큐리티는 인증과 권한 부여를 목표로합니다. 이는 단순히 데이터베이스 업데이트 일뿐입니다. –

+0

이렇게 스프링 보안 기능이 없으므로 자동화가 쉬워졌습니다. –

+0

내가 아는 기능이 없습니다. –

답변

3

다른 엔터티 필드의 수정처럼 암호 수정을 처리합니다.

이 경우에는 치골 사용자 개체에 대한 업데이트 양식을 만들 수 있습니다. 사용자 엔티티를 db에 저장하면 해시 된 암호를 저장하고 소금 등을 처리해야 할 수 있습니다. 그러나 이것은 봄철 보안 작업이 아닙니다.

+1

인코딩 된 암호에 대한 좋은 점! 당신은 Spring의'PasswordEncoder'를 다시 사용해야합니다. –

+0

@PavelHoral 예. 내 서비스 수업에 넣는다. – gipinani