ejemplo java spring-security spring-boot single-sign-on pre-authentication

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.