使用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系では使えない.
广告
将在 10 秒后关闭
bannerAds