详解Springboot Oauth2 Server搭建Oauth2认证服务

详解SpringBoot Oauth2 Server搭建Oauth2认证服务

1. 概述

OAuth,全称是“开放授权”,是一种用于授权的开放标准。在Web应用中,OAuth用于授权用户第三方应用访问资源的操作,比如在不需要输入用户名和密码的情况下授权第三方应用获取用户的个人信息。OAuth提供了一个安全的、开放的方式实现对用户的授权。

SpringBoot Oauth2 Server 是SpringBoot下基于Oauth2实现的认证服务。通过搭建Oauth2认证服务,用户可以获取到访问所需资源的令牌,实现对用户操作行为的授权管理。

2. 搭建步骤

2.1 添加依赖

在 pom.xml 文件中添加以下依赖:


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-server</artifactId>
</dependency>

2.2 配置文件

在 application.yml 文件中添加以下配置:


spring:
  security:
    oauth2:
      client:
        registration:
          my-client:
            client-id: my-client-id
            client-secret: my-client-secret
            # 客户端的授权类型
            authorization-grant-type: authorization_code
            redirect-uri: https://example.com/callback
        provider:
          my-auth-server:
            authorization-uri: https://auth-server.com/oauth/authorize
            token-uri: https://auth-server.com/oauth/token
            user-info-uri: https://auth-server.com/userinfo
            # 客户端需要获取的用户信息作用域
            scope: openid,profile,email

2.3 实现认证服务

创建一个类,实现AuthorizationServerConfigurer接口,完成实现认证服务的相关逻辑:

@Configuration
@EnableAuthorizationServer
public class MyAuthorizationServerConfig implements AuthorizationServerConfigurer {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    private TokenStore tokenStore;

    @Autowired
    private JwtAccessTokenConverter jwtAccessTokenConverter;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("my-client-id")
                .secret("{noop}my-client-secret")
                .authorizedGrantTypes("authorization_code", "refresh_token")
                .scopes("openid", "profile", "email")
                .autoApprove(true)
                .redirectUris("https://example.com/callback");
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints.authenticationManager(authenticationManager)
                .tokenStore(tokenStore)
                .accessTokenConverter(jwtAccessTokenConverter)
                .userDetailsService(userDetailsService);
    }

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

2.4 实现安全配置

创建一个类,实现SecurityConfigurerAdapter接口,完成安全配置的相关逻辑:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user")
                .password("{noop}password")
                .roles("USER");
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

3. 示例

3.1 实现认证

创建一个控制器,实现认证的相关逻辑:

@RestController
public class AuthController {

    @GetMapping("/login")
    public String login() {
        return "Please login";
    }

    @PostMapping("/login")
    public String doLogin(@RequestParam("username") String username, @RequestParam("password") String password) {
        return "login success";
    }
}

用户访问/login,将跳转到登录页面,然后在客户端,用户访问授权 URL,即 /oauth/authorize,并提供您的客户端 ID 和其他必要信息。Oauth2服务器会跳转到授权服务器并展示授权页面。

3.2 获取令牌

客户端需要获取访问资源的令牌,可以发送POST请求到 /oauth/token 端点以获取令牌:

POST /oauth/token HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Authorization: Basic bXktY2xpZW50LWlkOm15LWNsaWVudC1zZWNyZXQ=

grant_type=authorization_code&code=6f9f3279-9c69-40f9-a3f2-d655141386b4&redirect_uri=https://example.com/callback

成功获取到令牌后,在访问资源时需要在请求头中添加令牌信息:

GET /api/users HTTP/1.1
Host: api.example.com
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaXNzIjoiaHR0cHM6Ly9hdXRoLXNlcnZlci5jb20iLCJhdWQiOiJteS1jbGllbnQtaWQiLCJpYXQiOjE1MTYyMzkwMjIsImV4cCI6MTUxNjI0MzYyMn0.O8aXp-FNKO6GiPgbKDdY5GEwIhFc5-cGc01fhz9KnGqfuNyhOt-OI9Orrh4a-T3lIkSxO3sMFc9a3w6V_jYaPqfFjkIbuXYhsBAvU9CYoybjAGvyMxqv_0RfKK2AKt3hbM8erWvml-eN04DN1-Oc_4Zn3ZmgK5qlsJ3fCnYIc

以上就是搭建Oauth2认证服务的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Springboot Oauth2 Server搭建Oauth2认证服务 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Springboot项目使用html5的video标签完成视频播放功能

    下面是详细的讲解。 1. 引入video.js库 在静态文件目录(如:resources/static/)中引入video.js的库文件。 <link href="https://vjs.zencdn.net/7.11.4/video-js.css" rel="stylesheet" /> <scri…

    Java 2023年5月20日
    00
  • jsp下显示中文文件名及绝对路径下的图片解决方法

    下面是详细讲解“jsp下显示中文文件名及绝对路径下的图片解决方法”的完整攻略。 问题描述: 在jsp页面中,有时需要显示中文文件名或访问绝对路径下的图片,但这些操作并不是很直接,需要做一些额外的处理。 解决方案: 1. 文件名中文显示 在jsp页面中,如果要显示中文文件名,需要注意两点: 页面编码要设置为UTF-8,否则中文文件名会乱码。 使用URLEnco…

    Java 2023年6月15日
    00
  • java开发Dubbo负载均衡与集群容错示例详解

    Java开发 Dubbo负载均衡与集群容错示例详解 什么是Dubbo负载均衡? Dubbo负载均衡的作用是在服务提供者节点的集群中,按照一定的策略将客户端请求分发到不同的服务提供者节点上,以达到均衡负载的目的。 Dubbo负载均衡有以下几种策略: 随机(random):按权重随机,多数情况下按照权重比例分配请求。 轮询(roundrobin):按权重轮询,多…

    Java 2023年5月25日
    00
  • 聊聊ResourceBundle和properties读取配置文件的区别

    下面就聊聊ResourceBundle和properties读取配置文件的区别。 一、ResourceBundle和properties的概念 ResourceBundle和properties都是Java中读取配置文件的方式,都可以实现对配置文件的读取、修改和保存等操作。 ResourceBundle:是Java提供的一个用于打包国际化资源的类。它可以用来…

    Java 2023年5月20日
    00
  • Spring boot搭建web应用集成thymeleaf模板实现登陆

    下面就是详细讲解Spring Boot搭建Web应用集成Thymeleaf模板实现登录的攻略。 1. 新建Spring Boot项目 首先,打开IDE,新建一个Spring Boot项目。在Maven项目的pom.xml中添加thymeleaf依赖: <dependency> <groupId>org.springframework.…

    Java 2023年5月20日
    00
  • 四个实例超详细讲解Java 贪心和枚举的特点与使用

    四个实例超详细讲解Java 贪心和枚举的特点与使用 一、贪心算法 1. 特点 贪心算法是一种近似算法,它通过每一步的局部最优选择来达到全局最优解。贪心算法具有以下特点: 贪心选择性质:采用当前最优的选择,在局部达到最优解。 子问题最优性质:当前问题可以分解成多个子问题,每个子问题可以独立的求解,每个子问题的最优解包含在全局最优解中。 贪心策略:贪心算法强调局…

    Java 2023年5月19日
    00
  • JSP自定义标签简单入门教程

    下面我来为你详细讲解“JSP自定义标签简单入门教程”的完整攻略。 一、什么是JSP自定义标签 JSP自定义标签,即JSP Custom Tag,是指基于JSP技术实现的自定义标签,具有JSP标准标签库(JSTL)无法满足特定需求的功能。简单来说,就是我们可以自己定义标签,然后在JSP页面中使用这些标签。 二、JSP自定义标签的实现方式 JSP自定义标签的实现…

    Java 2023年6月15日
    00
  • Java如何读写Properties配置文件(Properties类)

    下面我将详细讲解“Java如何读写Properties配置文件(Properties类)”的完整攻略。 什么是Properties配置文件 Properties文件是Java中一种非常常用的配置文件格式,它采用Key-Value的形式存储数据,是一种轻量级的配置文件。Properties文件一般用于存储应用程序配置信息,如数据库连接信息、系统配置信息等。 P…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部