2017-05-14 7 views
1

ユーザーが資格情報を変更/更新できるように、REST APIエンドポイントを作成したいと考えています。 新しいパスワードをCustomUsersCredentialsに追加するか、良いアイデアか悪い考えですか?

私は

はCustomUserDetailsを持っている:

@Entity 
@Table(name="ACCOUNT_USER") 
public class CustomUserDetails implements UserDetails { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @NotBlank 
    @Column(name = "USERNAME", unique=true) 
    private String username; 

    @NotBlank 
    @Column(name = "PASSWORD") 
    private String password; 

    @Column(name = "LOCKED") 
    private boolean locked; 

    @ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    @JoinTable(name = "USER_ROLE", 
       joinColumns = @JoinColumn(name = "USER_ID"), 
       inverseJoinColumns = @JoinColumn(name = "ROLE_ID")) 
    private Set<CustomRole> roles; 

    public CustomUserDetails(String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<GrantedAuthority> authorities) { 
     this.setUsername(username); 
     this.setPassword(password); 
     this.roles = new HashSet<CustomRole>(); 
     for (GrantedAuthority authority: authorities) { 
      roles.add(new CustomRole(authority.getAuthority())); 
     } 
    } 

    public CustomUserDetails() { // jpa only 
    } 
    //setters and getters 
} 

レストコントローラは次のようになります。あなたが見ることができるように

@SuppressWarnings("rawtypes") 
@RequestMapping(value = "/singup", method = RequestMethod.PUT) 
public ResponseEntity updateCredentials(@RequestBody CustomUserDetails user, HttpServletResponse response) throws IOException { 

    logger.debug("Attempting credentials update " + user.getUsername()); 

    try { 
     authenticateUserAndSetSession(user, response); 
    } catch(BadCredentialsException ex) { 
     return SecurityUtils.createCustomResponseEntity(CustomStatusCode.BAD_CREDENTIALS); 
    } 

    customUserDetailsService.update(user, newPassword); // where to add this newPassword ? 

    return SecurityUtils.createCustomResponseEntity(CustomStatusCode.OK); 
} 

は、NOP CustomUserDetailsためnewPasswordのフィールドがあります。

このフィールドをこのオブジェクトに追加することは理にかなっていますか?他の選択肢は何ですか?この場合のベストプラクティスは何ですか?

+0

でフィールドを更新する場合ハッシング後、私は春のセキュリティの観点から答えを持っていないが、文字列にパスワードを格納するために避けるべきですセキュリティの理由。 char配列を使うか、どのオブジェクトにもそれを持たない方が良いです。 http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords – tima

答えて

1

CustomUserDetailsクラスにnewPasswordフィールドを追加するのは意味がありません。

第2に、別のエンドポイント(たとえば、/change_password,/update_passwordPOSTメソッドなどのエンドポイント)のパスワードのみを更新する方が良い方法です。しかしメソッドを/signupエンドポイントのCustomUserDetailsフィールドを更新することができますが、この場合はpasswordフィールドを無視してください。それをまっすぐに保たない方が良いです。

第三に、唯一このエンドポイント法は、ログインしているユーザーのすべてのために許可されているパスワード

  • を更新するためのベストプラクティス

    1. 別のエンドポイント。
    2. 次の2つの値を取る必要があります一つはoldPasswordであり、他のユーザーのハッシュログインの更新、パスワードの前にnewPassword
    3. をされ、新旧両方のパスワード(ユーザーを作成したときにハッシュアルゴリズムが同じでなければなりません)。
    4. DBから既存のハッシュされたパスワードと一致oldPasswordはその後、ハッシュされたnewPassword
  • 関連する問題