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");
}
}