Unten ist was ich bisher habe aber es tut nicht was ich will. Was ich will, ist eine 415, wenn der Inhaltstyp nicht json ist, und eine 400 jackson kann nicht deserialisieren oder wenn die Validierung falsch ist. Momentan sind das alles 401s und ich mache etwas falsches mit der Deserialisierung (hat den falschen Typ an json übergeben). Ich denke, es könnte eine Möglichkeit geben, das zu nutzen, was Spring MVC unter der Haube für einen normalen Controller tun würde.Was ist der beste Weg, um einen AuthenticationFilter mit REST-Funktionen zu schreiben?
@Component
public class JsonAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
private final ObjectMapper objectMapper;
private final Validator validator;
protected JsonAuthenticationFilter(final ObjectMapper objectMapper, final Validator validator) {
super(new AntPathRequestMatcher("/authentication/password", "POST"));
this.objectMapper = objectMapper;
this.validator = validator;
}
@Override
public Authentication attemptAuthentication(final HttpServletRequest request, final HttpServletResponse response)
throws AuthenticationException, IOException, ServletException {
if (request.getContentType() == null
|| !MediaType.APPLICATION_JSON.isCompatibleWith(MediaType.parseMediaType(request.getContentType()))) {
response.setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
throw new AuthenticationServiceException(
"Media Type not supported: " + request.getContentType());
}
PasswordCredentials credentials = objectMapper.readValue(request.getReader(), PasswordCredentials.class);
DataBinder dataBinder = new DataBinder(credentials);
dataBinder.setValidator(validator);
dataBinder.validate();
AbstractAuthenticationToken authRequest = credentials.toAuthenticationToken();
setDetails(request, authRequest);
return this.getAuthenticationManager().authenticate(authRequest);
}
/**
* Provided so that subclasses may configure what is put into the authentication
* request's details property.
*
* @param request that an authentication request is being created for
* @param authRequest the authentication request object that should have its details
* set
*/
protected void setDetails(HttpServletRequest request, AbstractAuthenticationToken authRequest) {
authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
}
@Override
@Autowired
public void setAuthenticationManager(final AuthenticationManager authenticationManager) {
super.setAuthenticationManager(authenticationManager);
}
}
Können Sie das PasswordCredentials-Objekt und ein JSON-Nachrichtenformat, das Sie senden, bereitstellen? – jlumietu
Schreiben Sie nicht selbst, suchen Sie nach bewährten Beispielen. Gute Quelle wäre JHipster für Start (https://github.com/jhipster/jhipster-sample-app-token) – Vaelyr
@jlumietu http://Stackoverflow.com/q/39166509/206466 Ich glaube nicht, dass die Struktur ist Besonders relevant, nur Änderung ist, dass ich 'toAuthentication' zu' toAuthentaitonitonToken' ändere – xenoterracide