75. 快速入门

75.1 OAuth2 单点登录

这是一个带有 HTTP 基本身份验证和单个用户帐户的 Spring Cloud“Hello World”应用程序:

app.groovy.

@Grab('spring-boot-starter-security')
@Controller
class Application {

  @RequestMapping('/')
  String home() {
    'Hello World'
  }

}

您可以使用spring run app.groovy和 watch 运行密码(用户名为“user”)。到目前为止,这只是 Spring Boot 应用程序的默认设置。

这是一个带有 OAuth2 SSO 的 Spring Cloud 应用程序:

app.groovy.

@Controller
@EnableOAuth2Sso
class Application {

  @RequestMapping('/')
  String home() {
    'Hello World'
  }

}

指出不同?此应用程序实际上与前一个应用程序完全相同,因为它还不知道它的 OAuth2 凭据。

您可以非常轻松地在 github 中注册应用程序,因此如果您想在自己的域中使用 production 应用程序,请尝试使用。如果您乐意在 localhost:8080 上进行测试,请在 application configuration 中设置这些 properties:

application.yml.

security:
  oauth2:
    client:
      clientId: bd1c0a783ccdd1c9b9e4
      clientSecret: 1a9030fbca47a5b2c28e92f19050bb77824b5ad1
      accessTokenUri: https://github.com/login/oauth/access_token
      userAuthorizationUri: https://github.com/login/oauth/authorize
      clientAuthenticationScheme: form
    resource:
      userInfoUri: https://api.github.com/user
      preferTokenInfo: false

运行上面的应用程序,它将重定向到 github 进行授权。如果您已经登录 github,您甚至不会注意到它已经过身份验证。这些凭据仅在您的应用程序在 port 8080 上运行时才有效。

要限制 client 获取访问令牌时要求的范围,您可以设置security.oauth2.client.scope(逗号分隔或 YAML 中的 array)。默认情况下,作用域为空,由 Authorization Server 决定默认值应该是什么,通常取决于它所拥有的 client 注册中的设置。

上面的示例都是 Groovy 脚本。如果要在 Java(或 Groovy)中编写相同的 code,则需要将 Spring Security OAuth2 添加到 classpath(e.g. 请参阅sample here)。

75.2 OAuth2 受保护资源

您想使用 OAuth2 令牌保护 API 资源吗?这是一个简单的 example(与上面的 client 配对):

app.groovy.

@Grab('spring-cloud-starter-security')
@RestController
@EnableResourceServer
class Application {

  @RequestMapping('/')
  def home() {
    [message: 'Hello World']
  }

}

application.yml.

security:
  oauth2:
    resource:
      userInfoUri: https://api.github.com/user
      preferTokenInfo: false