手把手教你搭建一个基于OAuth2.1规范的授权认证服务器(一):附源码

前言

技术更新:Spring Security OAuth已经逐渐被淘汰,而Spring Authorization Server是其官方推荐的替代方案。它提供了更现代、更安全的授权服务器实现,符合最新的OAuth 2.1规范。

项目需求:小灰工作上的项目需要搭建一个授权服务器,而原先使用的Spring Security OAuth,而该项目已经逐渐被淘汰,虽然网上有很多相关教程和资料,但考虑到技术的更新迭代,决定采用Spring Authorization Server来实现。

功能实现:该项目包括认证授权中心、资源服务器、客户端和服务端。通过使用Spring Authorization Server,可以确保这些功能的安全性和可靠性,同时遵循最新的安全标准。

项目功能

授权中心Server:进行认证、授权,并发放token、刷新token,不负责token鉴权(由资源服务器自行鉴权);

客户端Client:面向用户的操作入口;向Server请求token,携带token访问Resource;

资源服务器Resource:提供资源,需要携带token请求,可以自行鉴权;

项目结构

手把手教你搭建一个基于OAuth2.1规范的授权认证服务器(一):附源码_第1张图片

项目搭建

说明:项目相关架包、数据库脚本相关信息在项目里,具体可链接下载。

授权中心Server(spring-authorization-server):

application.yaml


server:
  port: 9000
  servlet:
    session:
      cookie:
        name: OAuth-Auth-Server
logging:
  level:
    root: info
    org.springframework.web: info
    org.springframework.security: trace
    org.springframework.security.oauth2: trace
spring:
  thymeleaf:
    cache: false
    prefix: classpath:/templates
#    check-template-location: true
    suffix: .html
    mode: HTML
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://ip:3306/oauth2.0?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: ********

新建AuthorizationServer相关配置

@Configuration
@EnableWebSecurity
public class AuthorizationServerConfig {
   

    @Autowired
    private PasswordEncoder passwordEncoder;
    /**
     * 授权服务器 SecurityFilterChain
     * @param http
     * @return
     * @throws Exception
     */
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http)
            throws Exception {
   
        OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
        http.getConfigurer(OAuth2AuthorizationServerConfigurer.class)
                .oidc(Customizer.withDefaults());  // Enable OpenID Connect 1.0

        http
                // 未从授权终结点进行身份验证时重定向到登录页面
                .exceptionHandling((exceptions) -> exceptions
                        .defaultAuthenticationEntryPointFor(
                                new LoginUrlAuthenticationEntryPoint("/login"),
                                new MediaTypeRequestMatcher(MediaType.TEXT_HTML)
                        )
                )
                // 接受用户信息和/或客户端注册的访问令牌
                .oauth2ResourceServer((resourceServer) -> resourceServer
                        .jwt(Customizer.withDefaults()));

        return http.build();
    }

    /**
     * 配置认证相关的过滤器链
     *
     * @param http spring security核心配置类
     * @return 过滤器链
     * @throws Exception 抛出
     */
    @Bean
    @Order(2)
    SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
   
        http.authorizeHttpRequests(authorizeRequests ->
                authorizeRequests
                // 允许的请求
                .requestMatchers(HttpMethod.GET, "/test").

你可能感兴趣的:(Spring,Authorization,Server,java,java,spring,boot,spring)