Spring Boot 中如何使用 Spring Security OAuth2 来实现单点登录

这篇具有很好参考价值的文章主要介绍了Spring Boot 中如何使用 Spring Security OAuth2 来实现单点登录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring Boot 中如何使用 Spring Security OAuth2 来实现单点登录

简介

在现代 Web 应用程序中,单点登录(Single Sign-On,简称 SSO)是一个非常重要的功能。Spring Security OAuth2 是 Spring Security 框架的一个扩展,它提供了一种简单的方式来实现 SSO。在本文中,我们将介绍如何在 Spring Boot 应用程序中使用 Spring Security OAuth2 来实现单点登录。

Spring Boot 中如何使用 Spring Security OAuth2 来实现单点登录

准备工作

在开始之前,我们需要安装 Java 开发环境和 Maven 构建工具。此外,我们还需要一个 OAuth2 服务器,本文中我们将使用 Keycloak 作为我们的 OAuth2 服务器。

你可以从 Keycloak 官方网站下载并安装 Keycloak,并确保它正在运行。在 Keycloak 中,我们需要创建一个名为 demo 的 Realm,然后为该 Realm 创建一个名为 web 的客户端。

配置 Spring Boot 应用程序

首先,我们需要在 pom.xml 文件中添加 Spring Security OAuth2 的依赖:

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

接下来,我们需要在 application.ymlapplication.properties 文件中配置 OAuth2 客户端信息,例如:

spring.security.oauth2.client.registration.keycloak.client-id=web
spring.security.oauth2.client.registration.keycloak.client-secret=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.keycloak.redirect-uri={baseUrl}/login/oauth2/code/{registrationId}
spring.security.oauth2.client.registration.keycloak.scope=openid,profile,email
spring.security.oauth2.client.provider.keycloak.token-uri=http://localhost:8080/auth/realms/demo/protocol/openid-connect/token
spring.security.oauth2.client.provider.keycloak.authorization-uri=http://localhost:8080/auth/realms/demo/protocol/openid-connect/auth
spring.security.oauth2.client.provider.keycloak.user-info-uri=http://localhost:8080/auth/realms/demo/protocol/openid-connect/userinfo
spring.security.oauth2.client.provider.keycloak.jwk-set-uri=http://localhost:8080/auth/realms/demo/protocol/openid-connect/certs
spring.security.oauth2.client.provider.keycloak.user-name-attribute=sub

在上面的配置中,我们指定了 OAuth2 客户端的相关信息,包括客户端 ID、客户端密钥、授权类型、重定向 URI、范围和提供程序的 URI。你需要根据实际情况修改这些配置。

配置 Spring Security

要使用 Spring Security OAuth2 实现单点登录,我们需要配置 Spring Security。在 Spring Boot 应用程序中,我们可以使用 @EnableOAuth2Sso 注释来启用 Spring Security OAuth2:

@Configuration
@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception { 
        http.antMatcher("/**")
            .authorizeRequests()
            .antMatchers("/", "/login**", "/error**")
            .permitAll()
            .anyRequest()
            .authenticated();
    }
}

在上面的代码中,我们使用 @EnableOAuth2Sso 注释启用 Spring Security OAuth2,并覆盖了 WebSecurityConfigurerAdapter 中的 configure 方法来配置 Spring Security 的 HTTP 安全。我们使用 antMatcher 方法指定要保护的 URL,使用 authorizeRequests 方法配置授权规则,使用 permitAll 方法允许所有用户访问登录页面,使用 authenticated 方法要求用户必须进行身份验证才能访问其他页面。

集成用户信息

在使用 Spring Security OAuth2 进行身份验证后,我们需要将用户的信息集成到我们的应用程序中。在 Spring Security OAuth2 中,我们可以使用 @EnableOAuth2Sso 注释中的 UserDetailsService 属性来配置用户信息服务,例如:

@Configuration
@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService;

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

    @Bean
    public GrantedAuthoritiesMapper grantedAuthoritiesMapper() {
        return (authorities) -> {
            Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
            for (GrantedAuthority authority : authorities) {
                mappedAuthorities.add(new SimpleGrantedAuthority(authority.getAuthority()));
            }
            return mappedAuthorities;
        };
    }

    @Bean
    public OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService() {
        return oidcUserRequest -> {
            OidcUserService delegate =new OidcUserService();
            OidcUser oidcUser = delegate.loadUser(oidcUserRequest);
            Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
            mappedAuthorities.add(new SimpleGrantedAuthority("ROLE_USER"));
            return new DefaultOAuth2User(mappedAuthorities, oidcUser.getAttributes(), oidcUser.getNameAttributeKey());
        };
    }
}

在上面的代码中,我们定义了一个 oidcUserService Bean,它使用 OidcUserService 类来加载用户信息,并将用户信息映射为 DefaultOAuth2User 对象。我们还定义了一个 grantedAuthoritiesMapper Bean,它将授权映射为与 Spring Security 兼容的形式。

集成注销功能

在单点登录中,注销功能也非常重要。在 Spring Security OAuth2 中,我们可以使用 SecurityContextLogoutHandler 类来实现注销功能,例如:

@Controller
public class LogoutController {

    @GetMapping("/logout")
    public String logout(HttpServletRequest request, HttpServletResponse response) {
        new SecurityContextLogoutHandler().logout(request, null, null);
        return "redirect:/";
    }
}

在上面的代码中,我们定义了一个 /logout 路径,当用户访问该路径时,我们将使用 SecurityContextLogoutHandler类来清除用户的身份验证信息,并将用户重定向到首页。

总结

在本文中,我们介绍了如何在 Spring Boot 应用程序中使用 Spring Security OAuth2 来实现单点登录。我们学习了如何配置 OAuth2 客户端信息、配置 Spring Security、集成用户信息和集成注销功能。希望这篇文章对你有所帮助!文章来源地址https://www.toymoban.com/news/detail-459231.html

到了这里,关于Spring Boot 中如何使用 Spring Security OAuth2 来实现单点登录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringCloud整合spring security+ oauth2+Redis实现认证授权

    在微服务构建中,我们一般用一个父工程来通知管理依赖的各种版本号信息。父工程pom文件如下: 在SpringCloud微服务体系中服务注册中心是一个必要的存在,通过注册中心提供服务的注册和发现。具体细节可以查看我之前的博客,这里不再赘述。我们开始构建一个eureka注册中

    2024年02月06日
    浏览(58)
  • spring security + oauth2 使用RedisTokenStore 以json格式存储

    1.项目架构  2.自己对 TokenStore 的 redis实现 3.自定义序列化类 4.配置使用redis类型的 TokenStore 5.完成认证模块的编写后,测试登录    json已经保存在数据库了 但是!!!!!,保存没问题,取出来的时候就有问题了,把这三个文件复制到资源服务器,让资源服务器也用MyRedisTokenStore 的方式读

    2024年02月14日
    浏览(34)
  • Spring Gateway+Security+OAuth2+RBAC 实现SSO统一认证平台

    背景:新项目准备用SSO来整合之前多个项目的登录和权限,同时引入网关来做后续的服务限流之类的操作,所以搭建了下面这个系统雏形。 : Spring Gateway, Spring Security, JWT, OAuth2, Nacos, Redis, Danymic datasource, Javax, thymeleaf 如果对上面这些技术感兴趣,可以继续往下阅读 如

    2024年02月13日
    浏览(55)
  • 【OAuth2系列】Spring Cloud Gateway 作为OAuth2 Client接入第三方单点登录代码实践

            在年初的时候我参与了一个项目,当时是很多家公司协同完成这个项目,其中一个公司专门负责登录这块的内容,需要我们的后端接入他们的单点登录(OAuth2 授权码模式),这块接入工作是由我来负责,我们的项目是微服务架构,经过网上各种查阅资料发现网关作为

    2024年02月04日
    浏览(66)
  • Spring Security OAuth2详解

    spring security oauth2框架即spring security + OAuth2,spring security上一篇文章已经讲过,接下来讲讲OAuth2,它是行业标准的授权协议,旨在为开发人员提供简单易用的授权流程;OAuth 定义了四种角色: 资源所有者:能够授予对受保护资源的访问权限的实体,当资源所有者是一个人时,

    2024年02月03日
    浏览(40)
  • Spring Security OAuth2.0(3):Spring Security简单入门

    Spring Security 快速入门。 本章代码已分享至Gitee:https://gitee.com/lengcz/security-spring-security qquad Spring Secutiry 是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是Spring生态系统的一员,因此它伴随着整个Spring生态系统不断修正、升级,

    2024年02月13日
    浏览(49)
  • Spring Security OAuth2.0(5):Spring Security工作原理

    qquad Spring Security 所解决的问题就是安全访问控制,而安全访问控制功能其实就是所有进入系统的请求进行拦截,校验每个请求是否能够访问它所期望的资源。Spring Security 对Web资源的保护是通过Filter入手的,所以从这个Filter入手,逐步深入Spring Security原理。 $qquad%当初始化

    2024年02月17日
    浏览(56)
  • Spring Security OAuth2.0 - 学习笔记

    OAuth2.0是一个开放标准,允许用户授权第三方应用程序访问他们存储在另外的服务提供者上的信息,而不需要将用户和密码提供给第三方应用或分享数据的所有内容。 1)授权码模式 2)简化模式 3)密码模式 4)客户端模式 普通令牌只是一个随机的字符串,没有特殊的意义,

    2024年02月16日
    浏览(50)
  • Spring Boot整合OAuth2实现GitHub第三方登录

    Github OAuth 第三方登录示例 第三方登录的原理是借助OAuth授权来实现,首先用户先向客户端提供第三方网站的数据证明自己的身份获取授权码,然后客户端拿着授权码与授权服务器建立连接获得一个Access Token,之后客户端就可以通过Access Token来与资源服务器进行交互。 使用O

    2024年02月08日
    浏览(67)
  • 微服务安全Spring Security Oauth2实战

    Spring Authorization Server 是一个框架,它提供了 OAuth 2.1 和 OpenID Connect 1.0 规范以及其他相关规范的实现。它建立在 Spring Security 之上,为构建 OpenID Connect 1.0 身份提供者和 OAuth2 授权服务器产品提供了一个安全、轻量级和可定制的基础。说白了,Spring Authorization Server 就是一个**认

    2024年02月03日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包