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界面
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)