在Spring Boot中使用OAuth2保护REST服务

解释OAuth2技术
正如我所说,咱们将使用OAuth2协议,所以首先要解释这个协议是如何工做的。
OAuth2有一些变体,但我将解释我将在程序中使用的内容,为此,我将给你一个例子,以便你了解咱们打算作什么。
举个例子,在商店里用信用卡付款。在这种场景下,有三个角色:商店、银行和咱们。OAuth2协议中也发生了相似的事情,就像这样:
1.客户或买方须要银行提供信用卡。而后,银行将收集咱们的信息,核实咱们是谁,并根据咱们账户中的资金向咱们提供信用卡或者直接拒绝咱们。在授予卡的OAuth2协议中,它称为身份验证服务器。
2.若是银行给了咱们卡,咱们能够去商店,即网络服务器,咱们提供信用卡。商店不欠咱们任何东西,但他们能够经过读卡器向银行询问他们是否能够信任咱们以及信用余额(信用余额)。商店是资源服务器。
3.商店,根据银行说咱们拥有的钱,将容许咱们购买。在OAuth2类比中,Web服务器将容许咱们访问页面,具体取决于咱们的财务情况。
若是您没有注意到一般使用身份验证服务器,当您转到网页并被要求注册时,它容许您经过Facebook或Google进行。Facebook或Google成为发行“卡”的“银行”,并会验证您的“信用”是否足够支付这个商品。
图片描述
您能够看到“El Pais”的网站并建立一个账户。若是咱们使用Google或Facebook,这个商店将依赖这些身份验证提供商提供的客户身份信息。在这种状况下,网站惟一须要的是拥有信用卡 - 不管余额如何
建立受权服务器
如今,让咱们看看如何建立银行、商店以及您须要的全部其余内容。
图片描述
首先,在咱们的项目中,咱们须要具备适当的依赖关系。咱们须要启动者:Cloud OAuth2,Security和Web。
那么,让咱们从定义银行开始; 这就是咱们以前说的:  AuthorizationServerConfiguration:
图片描述
咱们从 @ Configuration 标签开始,而后使用  @EnableAuthorizationServer 标记告诉Spring激活受权服务器。要定义服务器属性,咱们指定咱们的类扩展  AuthorizationServerConfigurerAdapter,实现了  AuthorizationServerConfigurerAdapter接口,因此Spring将使用这个类来参数化服务器。
咱们定义了一个Spring自动提供的AuthenticationManager ,咱们将使用它来收集@Autowired标签。咱们还定义了一个  TokenStore对象,做为public的功能 。
 虽然 AuthenticationManager由Spring提供的,但咱们必须本身配置它。我等等解释要如何完成这个配置。TokenStore或者IdentifierStore是身份验证服务器提供的标识符将存储的位置,所以当资源服务器(商店)要求信用卡上的信息时,身份验证服务器就要响应它。在这种状况下,咱们使用  InMemoryTokenStore将标识符存储在内存中的类。在实际应用中,咱们可使用JdbcTokenStore将它们保存在数据库中,以便在应用程序发生故障时,客户端没必要更新其信用卡。
在功能配置中 (ClientDetailsServiceConfigurer clients),咱们指定银行的凭证,包括身份验证的管理员,以及提供的服务。由于要访问银行,咱们必须为每一个提供的服务提供用户名和密码。这是一个很是重要的概念:用户名和密码来自银行,而不是客户。对于银行提供的每项服务,将进行单一认证,但对于不一样的服务可能相同。
我将详细说明这些内容:
clients.inMemory ()指定咱们将服务存储在内存中。在“真正的”应用程序中,咱们将其保存在数据库,LDAP服务器等中。
 withClient ("client")是咱们将在银行中识别的用户。在这种状况下,它将被称为“客户端”。将他称为“用户”会不会更好?
要  uthorizedGrantTypes ("password", "authorization_code", "refresh_token", "implicit") ,咱们指定配置定义的用户,对服务“ 客户端 ”。在咱们的示例中,咱们将仅使用密码服务。
 authorities ("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT", "USER") 指定所提供服务包含的角色或组。咱们也不会在咱们的例子中使用它,因此让咱们让它暂时运行。
 scopes ("read", "write")  是服务的范围 - 咱们也不会在咱们的应用程序中使用它。
 autoApprove (true)-若是您必须自动批准客户的请求,咱们会说是,以使应用程序更简单。
 secret (passwordEncoder (). encode ("password")) 是客户端的密码。请注意,调用咱们稍后定义的编码函数来指定密码将保存在何种类型的加密中。的编码功能进行注释与@Bean标签由于Spring,当咱们在HTTP请求中提供密码时,会查找一个  PasswordEncoder对象检查交付密码的有效性。
最后,咱们有一个函数   configure (AuthorizationServerEndpointsConfigurer endpoints) ,咱们定义哪一个身份验证控制器和标识符存储应该使用端点。澄清终点是咱们将与咱们的“银行”联系以请求卡的URL。
如今,咱们已经建立了咱们的身份验证服务器,可是根据引入的凭据,咱们仍然须要他知道咱们是谁并将咱们放在不一样的组中的方式。好吧,为此,咱们将使用与保护网页相同的类。
图片描述
如今,咱们能够检查咱们的受权服务器是否有效。让咱们看看如何使用优秀的PostMan程序。
咱们将使用HTTP请求类型POST,代表咱们要使用基本验证。在咱们的示例中,咱们将分别使用“client”和“password”来设置用户和密码,即“银行”的密码。
图片描述
在请求正文和form-url编码格式中,咱们将介绍要请求的服务,用户名和密码。
图片描述
图片描述
'access_token'“ 8279b6f2-013d-464a-b7da-33fe37ca9afb ”是咱们的信用卡,是咱们必须提供给咱们的资源服务器(商店)以查看非公开的页面(资源)的信用卡。
建立资源服务器(ResourceServer)
如今咱们有了信用卡,咱们将建立接受该卡的商店。
在咱们的示例中,咱们将使用Spring Boot在相同的程序中建立资源和身份验证服务器,它无需配置任何内容。若是像现实生活中同样,资源服务器在一个地方,而身份验证服务器在另外一个地方,咱们应该向资源服务器指出哪一个是咱们的“银行”以及如何与之交谈。可是,咱们将把它留给另外一个条目。
资源服务器的惟一类是  ResourceServerConfiguration:
图片描述
因为身份验证和资源服务器在同一个程序中,咱们只须要配置资源服务器的安全性。这是在函数中完成的:
图片描述
一旦咱们建立了资源服务器,咱们必须只建立服务,这些服务是经过这些行完成的:
图片描述
如今让咱们看看验证的工做原理。
首先,咱们检查咱们是否能够在没有任何验证的状况下访问“/ publica”:
图片描述
若是我尝试访问“/ private”页面,则会收到错误“401 unauthorized”,表示咱们无权查看该页面,所以咱们将使用咱们的受权服务器给用户受权。
图片描述
若是咱们能够看到咱们的私人页面,那么让咱们尝试管理员的页面:
图片描述
咱们固然没办法看到管理员的界面。所以,咱们将要求凭据管理员提供新令牌,但要向用户“管理员”代表身份。
返回的令牌是:“ab205ca7-bb54-4d84-a24d-cad4b7aeab57。” 这样就没问题了,咱们能够安全地去购物!如今,咱们只须要设置商店并拥有产品。
本人创业团队产品MadPecker,主要作BUG管理、测试管理、应用分发,有须要的朋友欢迎试用、体验!
本文为MadPecker团队产品经理译制,转载请标明出处数据库

相关文章
相关标签/搜索