Ho un filtro di autenticazione personalizzato che crea PreAuthenticatedAuthenticationToken e lo memorizza nel contesto di sicurezza. Il filtro funziona bene, crea il token con le autorizzazioni appropriate autorizzate "ROLE_user" e "ROLE_adminuser". Ecco la mia configurazione:PreAuthorize e Custom AuthenticationFilter with Spring boot
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
X509AuthenticationFilter filter = new X509AuthenticationFilter()
filter.setAuthenticationManager(authenticationManager())
http.addFilterAfter(filter, SecurityContextPersistenceFilter.class)
http.authorizeRequests().anyRequest().permitAll()
}
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean()
X509AuthenticationFilter filter = new X509AuthenticationFilter()
filter.setAuthenticationManager(authenticationManager())
registrationBean.setFilter(filter)
registrationBean.setEnabled(false)
return registrationBean
}
sto inserendo il filtro prima della SecurityContextPersistenceFilter come accennato in: Spring security and custom AuthenticationFilter with Spring boot.
Questo sembra funzionare bene, tuttavia, quando si tenta di aggiungere un'annotazione pre-autorizzare per il mio metodo di controllo, in questo modo:
@Controller
@RequestMapping("/security")
class SecurityController {
@RequestMapping("/authenticate")
@PreAuthorize("hasRole('ROLE_user')")
@ResponseBody
ResponseEntity<String> authenticate(HttpServletRequest request, Principal principal) {
println "authenticate: " + SecurityContextHolder.getContext().getAuthentication()
return new ResponseEntity<String>(getPreAuthenticatedPrincipal(request), HttpStatus.OK)
}
ottengo un errore 404. Se commento l'annotazione PreAuthorize, la chiamata al metodo funziona e puoi vedere che stampo le informazioni di autenticazione e l'utente autenticato ha ROLE_user e ROLE_adminuser per le sue autorizzazioni concesse. Non sono sicuro di cosa sto sbagliando.
Ecco la stampa fuori dell'oggetto autenticazione principale quando "pre-autorizzare" è commentata:
Authenticate: org.springframework.security[email protected]817a0240: Principal : or[email protected]c279eab8: Dn: uid = 1, ou = persone, dc = cdpe, dc = mil; Nome utente: [email protected]; Password: [PROTETTO]; Abilitato: true; AccountNonExpired: true; CredenzialiNonExpired: true; AccountNonLocked: true; Concesso Autorità: ROLE_adminuser, ROLE_user; Credenziali: [PROTETTO]; Autenticato: true; Dettagli: org.sprin[email protected]957e: RemoteIpAddress: 127.0.0.1; SessionId: null; Concesso Autorità: ROLE_adminuser, autorità ROLE_USER: [ROLE_adminuser, ROLE_USER]
Aggiornamento: Ho fatto un piccolo progresso. Ho aggiunto il proxyTargetClass per la seguente annotazione:
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)
Ora sto ricevendo 403 ritorna Forbidden quando chiamo il mio metodo. Non ho idea di cosa stia facendo.