如何在SpringBoot Security中实现OAuth2授权

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在SpringBoot Security中实现OAuth2授权相关的知识,希望对你有一定的参考价值。

参考技术A OAuth2已经成为了一个授权的标准协议,大家在很多的产品中都能看到它的身影,比如我们登录一个网站,支持微信,QQ等登录方式,这里QQ和微信提供了授权服务。有很多的授权组件都能提供这种OAuth2认证方式,比如keycloak等,但我们也可以在SpringBoot security中实现OAuth2授权,这篇文章将详细讲解每一个步骤来演示如何在SpringBoot中实现OAuth2授权。

OAuth 2 是一种授权协议,用于通过 HTTP 协议提供对受保护资源的访问。OAuth2 使第三方应用程序能够获得对资源的有限访问。资源的所有者告诉系统,同意授权第三方应用进入系统,获取对这些资源访问。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。
由于授权的场景众多,OAuth 2.0 协议定义了获取令牌的四种授权方式,分别是:

四种授权模式分别使用不同的 grant_type 来区分

OAuth 定义了四个角色

访问令牌的职责是在数据过期之前访问数据。
刷新令牌的职责是在现有访问令牌过期时请求新的访问令牌。

要使用 spring security oauth2 模块创建授权服务器,我们需要使用注解@EnableAuthorizationServer 并扩展类 AuthorizationServerConfigurerAdapter。

Spring security oauth 公开了两个用于检查令牌的端点(/oauth/check_token 和 /oauth/token_key),默认它们在 denyAll() 之后受保护。 tokenKeyAccess() 和 checkTokenAccess() 方法打开这些端点以供使用。
ClientDetailsServiceConfigurer 用于定义客户端详细信息,可以基于内存或 JDBC 实现。 为了演示的简单,例子中使用内存实现。 它具有以下重要属性:
clientId –(必需)客户端 ID。
secret(密钥) -(受信任的客户端需要)客户端密钥,如果有的话。
scope – 客户端受限的范围。 如果范围未定义或为空(默认),则客户端不受范围限制。
authorizedGrantTypes – 授权客户端使用的授权类型。 默认值为空。
权限 - 授予客户端的权限(常规 Spring Security 权限)。
redirectUris – 将用户代理重定向到客户端的重定向url。 它必须是绝对 URL。

要创建资源服务器组件,需要使用 @EnableResourceServer 注释并扩展 ResourceServerConfigurerAdapter 类。

上面的配置在 /api 开始的所有端点上启用保护。 所有其他端点都可以自由访问。
资源服务器还提供了一种机制来验证用户本身。 在大多数情况下,它将是基于表单的登录。

上面的 WebSecurityConfigurerAdapter 类设置了一个基于表单的登录页面,并使用 permitAll() 打开授权 URL。

为了简化的目的,仅提供了一个简单的获取用户profile的服务,如下:

我们在浏览器中访问 http://localhost:8080/api/users/me ,会跳转到SpringBoot security提供的登录页面,输入用户名jack,密码123456就可以访问该api,但作为第三方应用程序,没有用户名和密码,只能通过OAuth2令牌来访问

如上面的流程图所示,第一步是从 URL 获取资源所有者的授权,如下的url

它将跳转到Springboot security提供的login页面,用户提供用户名和密码,我们的例子中提供用户名jack,密码123456

上一步获取到了授权码,下一步第三方应用程序将使用授权码来获取访问令牌。 可以使用curl命令来获取access token。

authorization中需要使用basic认证,提供用户名clientapp,密码123456,可以使用下面的网站来获取加密后的字符串

授权服务将返回如下的信息,包括access_token,refresh_token和token_type等。

获得访问令牌后,我们可以前往资源服务器获取受保护的API.使用curl命令来访问API,authorization是上一步获取到的access_token。

获取信息如下:

如何使用 spring-security-core-ldap 插件在 grails 中实现 LDAP 身份验证?

【中文标题】如何使用 spring-security-core-ldap 插件在 grails 中实现 LDAP 身份验证?【英文标题】:How to implement LDAP authentication in grails with spring-security-core-ldap plugin? 【发布时间】:2012-02-19 09:44:11 【问题描述】:

我是 grails 的新手,正在尝试实现 LDAP 身份验证。我正在阅读官方文档,上面写着: “将 LDAP 属性映射到 UserDetails 数据有三个选项(由 grails.plugins.springsecurity.ldap.mapper.userDetailsClass 配置属性指定),希望其中之一足以满足您的需求。” 使用自定义选项很清楚,但我找不到有关这三个选项的任何信息和用法。它们是什么以及如何使用它们?

【问题讨论】:

【参考方案1】:

它们在第 3 节的配置中进行了描述:“使用 'person' 创建一个 Person,使用 'inetOrgPerson' 创建一个 InetOrgPerson,或者使用 null 创建一个 LdapUserDetailsImpl”。

【讨论】:

以上是关于如何在SpringBoot Security中实现OAuth2授权的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 spring-security-core-ldap 插件在 grails 中实现 LDAP 身份验证?

如何在 Spring Boot 应用程序中关闭 Spring Security

如何在spring-security中切换角色

在 Spring Security 中实现分层角色

如何在java中实现md5加密和解密

SpringBoot中实现依赖注入功能