我有這個RestController:
@RestController
@Slf4j
public class AuthenticationRestController {
@Value("${jwt.header}"/span>)
private String tokenHeader。
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private JwtTokenUtil jwtTokenUtil。
@Autowired[/span
private UserSecurityService userSecurityService。
@Autowired[/span
private EmailService emailService。
@PostMapping(path = "/api/v1/auth", consumes = "application/json", produces = "application/json")
public ResponseEntity<JwtAuthenticationResponse>
createAuthenticationToken( @RequestBody JwtAuthenticationRequest authenticationRequest,
HttpServletRequest request)拋出AuthenticationException {
LOG.info("authenticating {}" , authenticationRequest() " , authenticationRequest.getUsername())。
authenticate(authenticationRequest.getUsername(), authenticationRequest.getPassword()。
...
/**。
* 驗證用戶。如果出現問題,將拋出{@link AuthenticationException}。
*/
private void authenticate(String username。String password) {
Objects.requireNonNull(username)。
Objects.requireNonNull(password);
try {
authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(用戶名,密碼))。
} catch (DisabledException e) {
e.printStackTrace()。
throw new AuthenticationException("用戶被禁用!", e)。
} catch (BadCredentialsException e) {
throw new AuthenticationException("Bad credentials!"/span>, e)。
} catch (Exception e) {
e.printStackTrace()。
}
}
}
但是我在記錄時出現了這樣的錯誤:
org.springframework.security.authentication.DisabledException: 用戶已被禁用
在org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider$DefaultPreAuthenticationChecks.check(AbstractUserDetailsAuthenticationProvider.java:331)
at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:146)。
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:182)
at org.springframework.security.authenticate.ProviderManager.authenticate(ProviderManager.java:201)
at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:518)
at com.kispackp.security.controllers.AuthenticationRestController.authenticate(AuthenticationRestController.java:138)
并且
@Entity
@Table(name="t_user"/span>)
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@Data(ignoreUnknown = true)
@Builder
@AllArgsConstructor @Builder
@NoArgsConstructor
public class User implementsSerializable, UserDetails {
/** 可序列化類的序列版本UID。*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(unique = true)
@JsonIgnore(unique = true)
private String用戶名。
@JsonIgnore
private String password;
@Override
public Collection< ? extends GrantedAuthority> getAuthorities(/span>) {
return null;
}
@Override; }
public boolean isAccountNonExpired() {
return true。
}
@Override; }
public boolean isAccountNonLocked(){
return true。
}
@Override; }
public boolean isCredentialsNonExpired(){
return true。
}
uj5u.com熱心網友回復:
這個錯誤發生在用戶沒有被啟用的時候。介面UserDetails有一個名為isEnabled的方法,在驗證用戶時要檢查它。
AbstractUserDetailsAuthenticationProvider.java
...
if (!user.isEnabled() ) {
AbstractUserDetailsAuthenticationProvider.this.logger
.debug("Failed to authenticate since user account is disabled")。
throw new DisabledException(AbstractUserDetailsAuthenticationProvider.this.msages
.getMessage("AbstractUserDetailsAuthenticationProvider.disabled", "用戶已禁用"))。
}
...
你應該實作它,并在用戶被啟用的情況下回傳true,像這樣:
public class User implements Serializable, UserDetails {
...你當前的欄位和方法
@Override
public boolean isEnabled() {
return true;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/313451.html
標籤:
