使用GitHub OAuth实现SSO在Spring Boot 1.5.x环境中
想做的事情
我想在Spring Boot 1.5.15环境中实现OAuth2.0的单点登录(SSO)。我想将GitHub OAuth用作授权服务器。
环境
Spring Boot 1.5.15与JDK 1.8和Maven
关于利用的技术
春天安全 网
提供了用于客户端和Web应用程序之间的安全过滤器链。
每个过滤器可以进行过滤,如拒绝未经身份验证的用户访问。
安全过滤器链由过滤器链代理进行管理。
Spring Security的配置是通过继承名为WebSecurityConfigurerAdapter的默认配置类,并覆盖必要的部分来实现的。
公式参考资料:
https://docs.spring.io/spring-security/site/docs/4.2.5.RELEASE/apidocs/org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurerAdapter.html
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration // 設定クラスを自動的に読み込む
@EnableWebSecurity // Spring Securityを有効化
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(WebSecurity web) throws Exception {
// WebSecurityのメソッドチェーンでFilter Chain Proxyの設定(≒全体的な設定)を記述
...
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// HttpSecurityのメソッドチェーンでFilter Chainの設定(≒細かい設定)を記述
...
}
}
要在Thymeleaf中使用用户信息,需要使用thymeleaf-extras-springsecurity。你可以在https://github.com/thymeleaf/thymeleaf-extras-springsecurity找到它。
OAuth2.0 小编提示: 自行开发、掌握提高哦: OAuth2.0的意思是什么
以下是RFC6749的本地化版本链接:
https://tools.ietf.org/html/rfc6749
https://openid-foundation-japan.github.io/rfc6749.ja.html
这是一种用于授权(Authorization, AuthZ)的框架。
OAuth2.0涉及四个角色:用户,授权服务器,资源服务器和客户端。
用户通过授权服务器,将资源服务器上的资源使用授权给客户端。
这篇文章提供了非常易懂的总结。
通过OAuth2.0实现单点登录。
在OAuth2.0中,可以通过从资源服务器获取用户信息并进行比对来实现认证(Authentication, AuthN)。
对于使用GitHub OAuth的SSO情况,
-
- ユーザ = 人
-
- 認可サーバ = GitHub
-
- リソースサーバ = GitHub
- クライアント = Webアプリケーション
成为如此。
要在Spring Security中使用Spring Security OAuth。在application.properties文件的security.oauth2.resource.*中设置资源,security.oauth2.client.*中设置客户端。详细信息请查阅https://spring.io/projects/spring-security-oauth。
实施
资源URI是/demo。
<dependencies>
<!-- Web application -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- OAuth2.0 SSO -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class DemoController {
@GetMapping("/")
public String home() {
return "home";
}
}
<html xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
<meta charset="utf-8"/>
<title>Home</title>
</head>
<body>
<h1>Hello, <span sec:authentication="name"></span></h1>
</body>
</html>
import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated(); // 全てのURIへのアクセスにログインが必要
}
}
# 改行までが値と見なされることに注意
server.port=8080
server.context-path=/demo
# OAuth2クライアント(本アプリケーション)の設定
# クライアントクレデンシャル
security.oauth2.client.client-id=${DEMO__GITHUB_OAUTH_CLIENT_ID}
security.oauth2.client.client-secret=${DEMO__GITHUB_OAUTH_CLIENT_SECRET}
# アクセストークン取得URI
security.oauth2.client.access-token-uri=https://github.com/login/oauth/access_token
# 認可URI
security.oauth2.client.user-authorization-uri=https://github.com/login/oauth/authorize
# 認証スキーマ
security.oauth2.client.client-authentication-scheme=form
# OAuth2リソースサーバ(GitHub)の設定
# ユーザ情報取得URI
security.oauth2.resource.user-info-uri=https://api.github.com/user
# アクセストークンではなくリソースからユーザ情報を取得
security.oauth2.resource.prefer-token-info=false
# OAuth2によるSSOの設定
# SSOログインURI(非認証時のリダイレクトURI)
security.oauth2.sso.login-path=/login
迷上了網路遊戲
-
- application.propertiesでは行頭が#または!のときコメント行と見なされる.
-
- key=value # commentのように値に続けてコメントを書くことはできない.
- spring-security-oauth2-autoconfigureはSpring Boot 1系では使えない.