17

я после основного примера Spring загрузки oauth2 от Dave Syer: https://github.com/dsyer/sparklr-boot/blob/master/src/main/java/demo/Application.javaКак получить Весна загрузки и пример OAuth2 использовать другие грантовые пароль полномочия, чем по умолчанию

@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 
     } 

    } 
} 

Пример очень хорошо работает для обоих типов грантов, но в случае с паролем используется пользователь безопасности по умолчанию Spring Boot (тот, который отключен эхом «Использовать пароль безопасности по умолчанию: 927ca0a0-634a-4671-bd1c-1323a866618a» во время запуска).

Вопрос в том, как вы переопределяете учетную запись пользователя по умолчанию и на самом деле полагаетесь на WebSecurityConfig? Я добавил раздел как это:

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

Но не похоже, чтобы переопределить Spring по умолчанию пользователя/пароль, даже если документация предполагает, что он должен.

Что мне не хватает, чтобы получить эту работу?

+0

Нет, это не должно не, если вы добавите '@Order (SecurityProperties.ACCESS_OVERRIDE_ORDER)' к нему. Вы можете установить имя пользователя/пароль по умолчанию в файле application.properties, установив свойства 'security.user.name' и' security.user.password'. Дополнительные свойства см. В [справочном руководстве] (http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html). –

+0

Здесь есть лучший пример (более современный): https://github.com/spring-projects/spring-security-oauth/blob/master/tests/annotation/jdbc/src/main/java/demo/Application .java # L81. Этот метод authenticationManager является новым переопределением в моментальных снимках 2.0.4 (посмотрите на реализацию, если вы хотите использовать ее с 2.0.3). –

+0

@DaveSyer образец не запускался для меня: «Ошибка создания bean-компонента с именем» org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration '" –

ответ

7
@Configuration 
protected static class AuthenticationManagerConfiguration extends GlobalAuthenticationConfigurerAdapter { 

     @Override 
     public void init(AuthenticationManagerBuilder auth) throws Exception { 
      auth.inMemoryAuthentication().withUser("min").password("min").roles("USER"); 
     } 

    } 
+0

Да, это гораздо приятнее, чем то, что я должен был использовать в 2.0.3. –

6

Как я до сих пор на 2.0.3, я попробовал несколько вещей, и это, кажется, работает:

@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(); 
    } 
} 

Явно определяющий компонент AuthenticationManager, встроенный в аутентификации пользователя и ушел он начал полагаться на мою собственную inMemoryAuthentication. Когда выпущен 2.0.4, я буду переоценивать решение, которое Дэйв написал выше, поскольку он выглядит более элегантным.

+0

Я думаю, что это решение более подходит, когда вам нужно настроить статические страницы на вашем сервере OAuth, и они должны быть общедоступными. Вы можете переопределить «configure (HttpSecurity http)» и «configure (WebSecurity web)» и определить для этой цели определенные «antMatchers». –

+0

Вы знаете, как сохранить пользователей в базе данных и проверить их учетные данные на этом этапе? – Marcel

+0

Приветствия !!! Вышеупомянутое решение работает kudos @shawn – Harleen

3

В примере выше указывалось -
https://github.com/dsyer/sparklr-boot/blob/master/src/main/java/demo/Application.java
для Spring 1.3

При использовании Spring 1.5 и выше (который обычно будет случай сейчас) необходимость добавить дополнительное свойство.

Как уже отмечалось, мы можем использовать

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

важный момент при использовании Spring бутсу 1.5 и выше, также необходимо добавить следующее свойство -

security.oauth2.resource.filter-order = 3 

Столкнувшись много выпуска пытаясь определить это. также нашел хорошую ссылку для выше постановки задачи - Spring Boot + OAuth2 Example