mkyong example autoconfigure java spring spring-security spring-boot spring-security-oauth2

java - example - Cómo obtener los ejemplos de Spring Boot y OAuth2 para usar credenciales de concesión de contraseña que no sean las predeterminadas



spring security oauth2 example mkyong (3)

Estoy siguiendo el ejemplo básico de Spring Boot OAuth2 de Dave Syer: https://github.com/dsyer/sparklr-boot/blob/master/src/main/java/demo/Application.java

@Configuration @ComponentScan @EnableAutoConfiguration @RestController public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @RequestMapping("/") public String home() { return "Hello World"; } @Configuration @EnableResourceServer protected static class ResourceServer extends ResourceServerConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { // @formatter:off http // Just for laughs, apply OAuth protection to only 2 resources .requestMatchers().antMatchers("/","/admin/beans").and() .authorizeRequests() .anyRequest().access("#oauth2.hasScope(''read'')"); // @formatter:on } @Override public void configure(ResourceServerSecurityConfigurer resources) throws Exception { resources.resourceId("sparklr"); } } @Configuration @EnableAuthorizationServer protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationManager authenticationManager; @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.authenticationManager(authenticationManager); } @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { // @formatter:off clients.inMemory() .withClient("my-trusted-client") .authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit") .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT") .scopes("read", "write", "trust") .resourceIds("sparklr") .accessTokenValiditySeconds(60) .and() .withClient("my-client-with-registered-redirect") .authorizedGrantTypes("authorization_code") .authorities("ROLE_CLIENT") .scopes("read", "trust") .resourceIds("sparklr") .redirectUris("http://anywhere?key=value") .and() .withClient("my-client-with-secret") .authorizedGrantTypes("client_credentials", "password") .authorities("ROLE_CLIENT") .scopes("read") .resourceIds("sparklr") .secret("secret"); // @formatter:on } } }

El ejemplo funciona muy bien para ambos tipos de concesiones, pero la concesión de contraseña utiliza el usuario de seguridad predeterminado de Spring Boot (el que hace eco "Usando la contraseña de seguridad predeterminada: 927ca0a0-634a-4671-bd1c-1323a866618a" durante el inicio).

Mi pregunta es ¿cómo anula la cuenta de usuario predeterminada y realmente confía en un WebSecurityConfig? He añadido una sección como esta:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) protected static class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception { authManagerBuilder.inMemoryAuthentication().withUser("user") .password("password").roles("USER"); } }

Pero no parece anular la contraseña / usuario de Spring por defecto, aunque la documentación sugiere que debería hacerlo.

¿Qué me falta para que esto funcione?


Como todavía estoy en la versión 2.0.3, probé algunas cosas más y esto parece estar funcionando:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) protected static class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception { authManagerBuilder .inMemoryAuthentication() .withUser("user1").password("password1").roles("USER").and() .withUser("admin1").password("password1").roles("ADMIN"); } @Bean @Override public AuthenticationManager authenticationManager() throws Exception { return super.authenticationManager(); } }

Al definir explícitamente el bean authenticationManager, la autenticación de usuario integrada desapareció y comenzó a confiar en mi propia autenticación de memoria de datos. Cuando se lance 2.0.4, volveré a evaluar la solución que Dave publicó anteriormente, ya que parece que será más elegante.


El ejemplo señalado arriba -
https://github.com/dsyer/sparklr-boot/blob/master/src/main/java/demo/Application.java
es para la primavera 1.3

Si usa Spring 1.5 y superior (que normalmente será el caso ahora) debe agregar una propiedad adicional.

Como otros han señalado, podemos usar el

@Configuration @EnableWebSecurity public class EmployeeSecurityConfiguration extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/resources/**"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/user/getEmployeesList") .hasAnyRole("ADMIN").anyRequest().authenticated().and().formLogin() .permitAll().and().logout().permitAll(); http.csrf().disable(); } @Override public void configure(AuthenticationManagerBuilder authenticationMgr) throws Exception { authenticationMgr.inMemoryAuthentication().withUser("javainuse").password("javainuse") .authorities("ROLE_ADMIN"); } }

El punto importante es si el uso de Spring Boot 1.5 y superior también necesita agregar la siguiente propiedad:

security.oauth2.resource.filter-order = 3

Enfrenté muchos problemas tratando de identificar esto. También se encontró una buena referencia para la declaración del problema anterior - Ejemplo de Spring Boot + OAuth2


@Configuration protected static class AuthenticationManagerConfiguration extends GlobalAuthenticationConfigurerAdapter { @Override public void init(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("min").password("min").roles("USER"); } }