如何在SpringBoot Security中实现OAuth2授权

如何在SpringBoot Security中实现OAuth2授权,第1张

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实现用户登录功能。

这章新创建一个模块来开发。 创建模块参考 这里 。模块的ArtifactId为bhuser。

下面先写两个页面,需要在pom.xml文件中引入spring-boot-starter-thymeleaf。文件内容:

既然是安全控制,就需要有控制的点。这里写两个Controller,分别是两个界面。到最后的目标是一个界面不需要登录就可以浏览,一个界面需要用户登录后才能浏览。

在包com.biboheart.demos.controller下创建PageController。内容如下:

在sources/templates中创建两个页面,分别是home.html和hello.html

home.html内容如下:

hello.html内容如下:

启动服务后,访问localhost

点击连接“这里”进入hello页面。

现在是没有权限控制的情况下的结果。下面来增局兄没加安全控制,使home页面可以访问,hello页面需要用户登录才能访问。

在pom.xml中引入spring-boot-starter-security组件

这时候启动项目,访问首页就会跳转到登录页面了。

这个登录页面是框架提供的。用户名和密码是框架生成的。这样的用户名桐纳密码不可控制。接下增加自己的登录认证业务。

创建包com.biboheart.demos.security,安全控制的业务写在这个包下。创建security配尘森置文件SecurityConfiguration,内容:

注意,Spring Security 5必须配置 passwordEncoder。

重启服务,访问localhost

点击连接“这里”,跳转到了login界面


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12566176.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存