java - spring security ejemplo
¿Cómo configurar autenticación basada en encabezado de autenticación previa en Spring Boot? (1)
Esta es mi forma de configurar la seguridad previa a la autenticación basada en userService inyectado:
@Configuration
@EnableWebSecurity
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(jsr250Enabled = true, securedEnabled = true, prePostEnabled = true, proxyTargetClass = true)
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {
private static final Logger LOG = Logger.getLogger(ApplicationSecurity.class.getName());
@Autowired
private UserService userService; // implements AuthenticationUserDetailsService...
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
LOG.info("configure autentication provider with custom userService");
PreAuthenticatedAuthenticationProvider paaProvider = new PreAuthenticatedAuthenticationProvider();
paaProvider.setPreAuthenticatedUserDetailsService(userService);
auth.authenticationProvider(paaProvider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
LOG.info("configure autentication filter");
// ...
}
}
Mi aplicación recibe un encabezado de solicitud AUTH_USER con nombre de usuario de Oracle Access Manager SSO. Spring Security "Additional Topics" 2.2.1 tiene un ejemplo de "PreAuth" que parece ser lo que necesito, pero no es un ejemplo completo.
Los fragmentos a continuación son de documentos / ejemplos, no funcionan la configuración basada en anotaciones.
Configuración de ejemplo de Siteminder: uso de XML con RequestHeaderAuthenticationFilter y PreAuthenticatedAuthenticationProvider y UserDetailsService para buscar usuarios.
¿Cómo se relaciona esto con la configuración basada en Java?
<security:http>
<!-- Additional http configuration omitted -->
<security:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
</security:http>
<bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
<property name="principalRequestHeader" value="AUTH_USER"/>
<property name="authenticationManager" ref="authenticationManager" />
</bean>
<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth. PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService">
<bean id="userDetailsServiceWrapper"
class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
<property name="userDetailsService" ref="userDetailsService"/>
</bean>
</property>
</bean>
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider ref="preauthAuthProvider" />
</security:authentication-manager>
El ejemplo preauth de Spring Security tiene una configuración completamente diferente (la configuración XML es aún más intimidante). No se menciona el filtro de preautor o cómo configurar el nombre del encabezado.
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login","/resources/**").permitAll()
.anyRequest().authenticated()
.and()
.jee()
.mappableRoles("USER","ADMIN");
}
}
El spring-boot-sample-web-secure extiende WebMvcConfigurerAdapter en lugar de WebSecurityConfigurerAdapter, y solo hace inicios de sesión básicos basados en formularios, no hay información sobre cómo obtener el ID de usuario del encabezado AUTH_USER preauth.
public class SampleWebSecureApplication extends WebMvcConfigurerAdapter {
... omitted...
@Bean
public ApplicationSecurity applicationSecurity() {
return new ApplicationSecurity();
}
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {
@Autowired
private SecurityProperties security;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().fullyAuthenticated().and().formLogin()
.loginPage("/login").failureUrl("/login?error").permitAll();
}
}
}
He leído muchas referencias / artículos, pero no parecen estar relacionados con el código actual y Spring-boot, por lo que estoy atascado tratando de entender cómo configurar la aplicación de seguridad previa a la autenticación.