1 回答

TA貢獻1827條經驗 獲得超9個贊
我不得不放棄嘗試讓 Spring Security 自動為入口點提供來自用戶詳細信息服務的異常消息的想法。
因此,我改用自定義身份驗證提供程序以獲得更多控制,并引入了一個名為 ErrorMessage 的自定義服務:
@Getter
@Setter
@ToString
@Service
public class ErrorMessage {
private String status;
private String message;
}
@Getter、@Setter 和@ToString 注釋來自 lombok。他們做到了,所以我不必編寫 setter 和 getter 以及 toString 方法。
在我的自定義身份驗證提供程序中,我只是這樣設置錯誤消息:
private @Autowired ErrorMessage errorMessage;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
try {
String username = authentication.getName();
String password = authentication.getCredentials().toString();
if (!credentials.checkUserExists(username)) {
//set something here
}
memberProfile = credentials.getUserInformation(username);
if (passwordEncoder.matches(password, memberProfile.getPassword())) {
logger.info("It matches - encoder!");
return new UsernamePasswordAuthenticationToken(username, password, getGrantedAuthorities());
} else {
//error message bean utilised here
errorMessage.setStatus("100");
errorMessage.setMessage(username + "'s password is incorrect");
throw new BadCredentialsException("The credentials provided are incorrect");
}
} catch (Exception ex) {
throw new BadCredentialsException("The credentials provided are incorrect", ex);
}
}
然后我以這種方式在入口點獲得自定義錯誤消息:
@Component
public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {
private @Autowired ErrorMessage errorMessage;
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException ex) throws IOException, ServletException {
//String json = String.format("{\"errorcode\": \"%s\", \"message\": \"%s\"}", response.getStatus(), ex.getMessage());
String json = String.format("{\"errorcode\": \"%s\", \"message\": \"%s\"}", errorMessage.getStatus(), errorMessage.getMessage());
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(json);
}
}
添加回答
舉報