如何在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 身份验证?