วิธีตรวจสอบว่า BadCredentialsException ไม่ถูกโยนลงใน loadUserByUsername

ฉันกำลังตรวจสอบผู้ใช้ของฉันด้วย UserDetailsService:

<authentication-manager alias="authenticationManager">          
      <authentication-provider user-service-ref="userDetailsService">
         <password-encoder hash="sha"/>             
      </authentication-provider>   
    </authentication-manager> 

คลาส userDetailsService:

@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserService userService;


    @Override
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException, DataAccessException {

User user = null;
    try {
        user = userService.getUserByUsername(username);
    } catch (Exception e) {
        e.printStackTrace();
    }


   if (user.isForceChangePass()) {
        MyForcePasswordChangeException bad = new MyForcePasswordChangeException(
                "Password is not valid, and it must be changed!");
        throw bad;
    }

}

แก้ไข:

หลังจากได้รับชื่อผู้ใช้แล้ว ฉันจะตรวจสอบตัวบ่งชี้ ForceChangePass และหากเป็นจริง ฉันผ่านข้อยกเว้นของตัวเอง ซึ่งส่งผลให้ผู้ใช้เข้าสู่ระบบ FailureHandler (แม้ว่ารหัสผ่านจะถูกต้องหรือไม่ก็ตาม) ฉันต้องการใน LoginFailureHandler เพื่อตรวจสอบว่าข้อยกเว้นของฉันถูกส่งออกไปหรือไม่ ในกรณีที่เข้าสู่ระบบสำเร็จเท่านั้น .


person fresh_dev    schedule 28.02.2012    source แหล่งที่มา


คำตอบ (1)


loadUserByUsername() ไม่ควรตรวจสอบข้อมูลประจำตัว ควรโหลดเฉพาะวัตถุ UserDetails (มีเมธอด getPassword()) หรือโยน UsernameNotFoundException

หากคุณต้องการตรวจสอบว่าผู้ใช้ตรวจสอบสิทธิ์สำเร็จหรือไม่ โปรดดูที่ การฟังการเข้าสู่ระบบที่สำเร็จด้วย Spring Security:

<form-login 
  authentication-success-handler-ref="authenticationSuccessHandler"
  authentication-failure-url="authenticationFailureHandler"/>

คุณต้องใช้ AuthenticationSuccessHandler และ AuthenticationFailureHandler.

หรือพิจารณาคลาสย่อย BasicAuthenticationFilter และแทนที่ onSuccessfulAuthentication() และ onUnsuccessfulAuthentication()

person Tomasz Nurkiewicz    schedule 28.02.2012
comment
ฉันเพิ่มรายละเอียดเพิ่มเติมสำหรับคำถามของฉัน - person fresh_dev; 28.02.2012
comment
@fresh_dev: แล้วการตรวจสอบ ForceChangePass ใน AuthenticationSuccessHandler ล่ะ และหากตั้งค่าไว้ จะทำให้เซสชันใช้ไม่ได้และเปลี่ยนเส้นทางผู้ใช้ให้เปลี่ยนหน้ารหัสผ่าน คุณมีชิ้นส่วนทั้งหมดพร้อมแล้ว (Authentication คำขอและคำตอบ) - person Tomasz Nurkiewicz; 28.02.2012