当前位置: 首页 > news >正文

Spring Security实战:如何实现OAuth2.0认证与授权?

1. 添加依赖

首先,确保你的项目中包含了Spring Security和OAuth2.0相关的依赖。如果你使用的是Maven,可以在pom.xml中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security.oauth.boot</groupId>
    <artifactId>spring-security-oauth2-autoconfigure</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

运行 HTML

2. 配置OAuth2.0客户端

application.ymlapplication.properties中配置OAuth2.0客户端信息。例如:

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: your-google-client-id
            client-secret: your-google-client-secret
            scope: email, profile
 

3. 配置Spring Security

创建一个配置类来配置Spring Security,启用OAuth2.0登录功能。

import org.springframework.context.annotation.Bean;
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
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

4. 创建用户信息服务(可选)

如果你需要自定义用户信息的获取方式,可以实现OAuth2UserService接口。

import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;

@Service
public class CustomOAuth2UserService extends DefaultOAuth2UserService {

    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
        OAuth2User user = super.loadUser(userRequest);
        // 在这里可以自定义用户信息的处理逻辑
        return user;
    }
}
 

5. 配置OAuth2.0用户信息服务

SecurityConfig中配置自定义的OAuth2UserService

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
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;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
import org.springframework.security.oauth2.core.user.OAuth2User;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomOAuth2UserService customOAuth2UserService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/login**", "/error**").permitAll()
                .anyRequest().authenticated()
            .and()
            .oauth2Login()
                .userInfoEndpoint()
                    .userService(customOAuth2UserService);
    }
}
 

6. 运行应用程序

启动应用程序后,访问受保护的资源时,系统会自动重定向到OAuth2.0提供商的登录页面。登录成功后,用户将被重定向回应用程序,并且可以访问受保护的资源。

7. 处理用户信息

在控制器中,你可以通过@AuthenticationPrincipal注解获取当前登录的用户信息。

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/user")
    public String user(@AuthenticationPrincipal OAuth2User principal) {
        return "Hello, " + principal.getAttribute("name");
    }
}
 

8. 配置资源服务器(可选)

如果你需要保护API资源,可以配置一个资源服务器。

import org.springframework.context.annotation.Bean;
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;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter;

@Configuration
@EnableWebSecurity
public class ResourceServerConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/api/**").authenticated()
            .and()
            .oauth2ResourceServer()
                .jwt();
    }

    @Bean
    public JwtAuthenticationConverter jwtAuthenticationConverter() {
        JwtGrantedAuthoritiesConverter grantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
        grantedAuthoritiesConverter.setAuthoritiesClaimName("roles");
        grantedAuthoritiesConverter.setAuthorityPrefix("ROLE_");

        JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
        jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(grantedAuthoritiesConverter);
        return jwtAuthenticationConverter;
    }
}

总结

通过以上步骤,你可以在Spring Security中实现OAuth2.0认证与授权。根据具体需求,你可以进一步自定义用户信息的处理、权限控制等。

相关文章:

  • Spring Boot 实战:构建 RESTful API 服务
  • Vue 项目中配置代理的必要性与实现指南
  • ChatGPT入驻Safari,AI搜索时代加速到来
  • 打包rocketmq-dashboard报错问题记录
  • 游戏引擎学习第125天
  • 免费使用SCI润色神器QuillBot
  • LabVIEW同步数据采集功能
  • 力扣1:两数之和
  • mac设置 pip 的镜像
  • Windows逆向工程入门之LOOP与REP指令的深度解析
  • Ubuntu 20.04环境下安装cuda、cuDNN和pytorch
  • 计算机毕设-基于springboot的仁和机构的体检预约系统的设计与实现(附源码+lw+ppt+开题报告)
  • 安科瑞AM5SE-IS防孤岛保护装置:新能源领域的“安全卫士“-安科瑞 耿笠
  • 记一次线上Tomcat服务内存溢出的问题处理
  • vue3使用iframe全屏展示pdf效果
  • 基于 Spring Boot +VUE的 “机动车号牌管理系统” 系统的设计与实现
  • JavaScript 系列之:Ajax、Promise、Axios
  • <网络> 网络基础3
  • 建筑三维设计软件如何实现弯道超车?
  • AI知识架构之神经网络
  • 俄官员说将适时宣布与乌克兰谈判代表
  • 孙简任吉林省副省长
  • 讲一个香港儿童的故事,《劏房的天空》获“周庄杯”特等奖
  • 工人日报:“鼠标手”被纳入职业病,劳动保障网越织越密
  • 郑州通报涉“健康证”办理有关问题查处进展情况
  • 训练孩子的科学思维,上海虹口推出“六个一百”旗舰工程