Безопасность Spring - реализация oauth2 sso

Я хочу реализовать центральную систему аутентификации с Spring Security и oauth2 sso. Другими словами, у меня есть приложение весенней загрузки, которое отвечает за авторизацию, и один простой клиент. У моего клиента есть API отдыха. Сначала я получаю токен от сервера авторизации, затем отправляю запрос клиентскому API с заголовком авторизации, содержащим токен-носитель из вышеуказанного запроса. Но этот запрос всегда возвращает мне страницу входа на сервер.

Вот реализация сервера и клиента:

Server

AuthorizationServerConfig.java

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

@Autowired
private AuthenticationManager authenticationManager;


@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
    oauthServer
            .tokenKeyAccess("permitAll()")
            .checkTokenAccess("isAuthenticated()");
}



@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    clients.inMemory()
            .withClient("SampleClientId")
            .secret("{noop}secret")
            .authorizedGrantTypes("password")
            .scopes("user_info")
            .autoApprove(true);
}

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    endpoints.authenticationManager(this.authenticationManager);
}

ApplicationConfig:

@SpringBootApplication
@EnableResourceServer
public class ApplicationConfig extends SpringBootServletInitializer {

public static void main(String[] args) {
    SpringApplication.run(ApplicationConfig.class, args);
}

}

SecurityConfig:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {


@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    //this is just example
    auth.inMemoryAuthentication().withUser("user").password("{noop}1234").roles("user");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.requestMatchers()
            .antMatchers("/login", "/oauth/authorize", "/oauth/token")
            .and()
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .formLogin().permitAll();

}

@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
}

application.yml:

server:
  port: 8900
  servlet:
    context-path: /auth

Client:

ApplicationConfig:

@SpringBootApplication
public class ApplicationConfig {

public static void main(String[] args) {
    SpringApplication.run(ApplicationConfig.class, args);
}

}

SecurityConfig:

@Configuration
@EnableOAuth2Sso
public class ApplicationSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/", "/login**")
            .permitAll()
            .anyRequest()
            .authenticated();
}
}

TestController:

@RestController
public class HomeController {

@GetMapping("/")
public String index() {
    return "home";
}

@RequestMapping("/admin")
public String admin() {
    return "admin";
}
}

application.yml:

server:
  port: 9000
  servlet:
    context-path: /client1
security:
  basic:
    enabled: false
  oauth2:
    client:
      clientId: SampleClientId
      clientSecret: secret
      accessTokenUri: http://localhost:8900/auth/oauth/token
      userAuthorizationUri: http://localhost:8900/auth/oauth/authorize
    resource:
      userInfoUri: http://localhost:8900/auth/user/me

Сначала я отправляю client_id и секретный код вместе с именем пользователя, паролем и grant_type на localhost:8900/auth/oauth/token и получаю такой результат:

{
  "access_token": "603b505f-e701-43d0-b8b8-976a2178f7ea",
  "token_type": "bearer",
  "expires_in": 43199,
  "scope": "user_info"
}

Теперь я беру вышеуказанный токен и отправляю запрос localhost:9000/client1/admin с заголовком, содержащим вышеуказанный токен. Но кажется, что клиентское приложение игнорирует заголовок и в результате показывает страницу входа на сервер. Как я могу исправить эту проблему?


person hamed    schedule 27.11.2018    source источник


Ответы (1)


@EnableOAuth2Sso - это аннотация для использования OAuth 2.0 в качестве механизма аутентификации конечного пользователя (например, кнопка «Войти через Google»). Эта аннотация связывает ваше приложение с перенаправлением на страницу входа на сервере авторизации, где вы должны войти в систему, а затем перенаправить обратно в свое приложение.

Если это ваше намерение, вам необходимо обновить свой сервер авторизации. для поддержки authorization_code потока предоставления вместо password потока предоставления.

Однако, если ваш клиент является строго REST API, вам, скорее всего, потребуется подключить клиент, используя @EnableResourceServer вместо @EnableOAuth2Sso. Сервер ресурсов - это то, что принимает токен в качестве авторизации через HTTP-заголовок авторизации.

person jzheaux    schedule 27.11.2018
comment
Спасибо. Использование @EnableResourceServer вместо @EnableOAuth2Sso решило мою проблему. - person hamed; 28.11.2018