当前位置: 首页 > 科技观察

Keycloak简单几步实现对SpringBoot应用的权限控制

时间:2023-03-12 22:54:34 科技观察

我们在上一篇文章中尝试了keycloak,手动创建了一个名为felord.cn的realm,并在realm下创建了一个名为felord的用户。今天就来试试对应的SpringBootAdapter,看看keycloak是如何保护SpringBoot应用的。关注并star码农小胖??哥,第一时间获取相关干货文章。客户端相信很多同学都用过微信开放平台和蚂蚁开放平台。首先,我们需要在这些开放平台上注册一个客户端,以获得一组凭证,如用户名和密码。有的叫做appid和secret;有些被称为clientid和secret,这两个意思是一样的。其实keycloak也是类似的,也是需要在对应的realm注册一个client。下图不仅清晰的说明了keycloak中Masterrealm和customrealm的关系,也说明了一个realm中users和clients的关系。Realm、client、用户关系图我们需要在felord.cn的realm中创建一个client:Createaclientintherealm客户端创建完成后,你会发现felord.cn中多了一个client:领域。您可以通过http://localhost:8011/auth/realms/felord.cn/account/登录创建的用户。然后我们编辑配置客户端spring-boot-client:填写重定向URL进行测试,这里我只填写设置选项卡中唯一必填项,有效重定向URI,这个选项表示客户端springboot-的所有API客户端受权限控制。基于角色的访问控制是目前主流的访问控制思想,keycloak也采用了这种方式。我们需要创建一个角色并将其授予上一篇文章中创建的用户felord。让我们创建一个简单的角色:在keycloak中创建一个角色keycloak的角色非常强大。在接下来的系列文章中,胖哥将和大家一起深入学习这个概念。将角色映射到用户,然后我们将上面创建的角色base_user分配给用户felord:将角色分配给领域中的用户。到这里用户、角色、角色映射都搞定了,剩下的就是在客户端定义资源了。获取并刷新JWT我们可以通过以下方式获取用户登录的JWT对:POST/auth/realms/felord.cn/protocol/openid-connect/tokenHTTP/1.1Host:localhost:8011Content-Type:application/x-www-form-urlencodedclient_id=springboot-client&username=felord&password=123456&grant_type=password会得到:{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiS省略","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAi省略","token_type":"Bearer","not-before-policy":0,"session_state":"2fc7e289-c86f-4f6f-b4d3-1183a9518acc","scope":"profileemail"}刷新Token,只需要把refresh_token和grant_type改成refresh_token来刷新Token。以下是请求刷新的消息:POST/auth/realms/felord.cn/protocol/openid-connect/tokenHTTP/1.1Host:localhost:8011Content-Type:application/x-www-form-urlencodedclient_id=springboot-client&grant_type=refresh_token&refresh_token=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlYWE2MThhMC05Y2UzLTQxZWMtOTZjYy04MGQ5ODVkZjJjMTIifQ.eyJleHAiOjE2MjU3NjI4ODYsImlhdCI6MTYyNTc2MTA4NiwianRpIjoiZjc2MjVmZmEtZWU3YS00MjZmLWIwYmQtOTM3MmZiM2Q4NDA5IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDExL2F1dGgvcmVhbG1zL2ZlbG9yZC5jbiIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODAxMS9hdXRoL3JlYWxtcy9mZWxvcmQuY24iLCJzdWIiOiI0YzFmNWRiNS04MjU0LTQ4ZDMtYTRkYS0wY2FhZTMyOTk0OTAiLCJ0eXAiOiJSZWZyZXNoIiwiYXpwIjoic3ByaW5nYm9vdC1jbGllbnQiLCJzZXNzaW9uX3N0YXRlIjoiZDU2NmU0ODMtYzc5MS00OTliLTg2M2ItODczY2YyNjMwYWFmIiwic2NvcGUiOiJwcm9maWxlIGVtYWlsIn0.P4vWwyfGubSt182P-vcyMdKvJfvwKYr1nUlOYBWzQks注意:两个请求的content-type都是application/x-www-form-urlencodedSpringBoot客户端建一个很传统的SpringBoot应用,别忘了带上SpringMVC模块,然后加入keycloak'sstarter:org.keycloakkeycloak-spring-boot-starter14.0.0Thecurrentkeycloakversionis14.0.0.然后随便写一个SpringMVC接口:/***@authorfelord.cn*@since2021/7/717:05*/@RestController@RequestMapping("/foo")publicclassFooController{@GetMapping("/bar")publicStringbar(){return"felord.cn";}}接下来,我们声明只有在felord.cnrealm中具有base_user角色的用户才能访问/foo/bar接口。那么定义在哪里呢?我们先在springboot的application.yml中静态定义,后面再实现动态控制。配置如下:keycloak:#声明客户端所在realmrealm:felord.cn#keycloak授权服务器地址auth-server-url:http://localhost:8011/auth#clientnameresource:springboot-client#declarethisisApublicclient,否则不能在keycloak的外部环境中使用,会是403public-client:true#这里是配置client的安全约束,即那些角色映射那些资源security-constraints:#角色与资源的映射关系。下面是多对多的配置方式,这里只配置base_user访问/foo/bar-auth-roles:-base_usersecurity-collections:-patterns:-'/foo/bar'然后启动SpringBoot应用在浏览器中调用http://localhost:8080/foo/bar,会发现浏览器会跳转到如下地址:http://localhost:8011/auth/realms/felord.cn/protocol/openid-connect/auth?response_type=code&client_id=springboot-client&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Ffoo%2Fbar&state=20e0958d-a7a9-422a-881f-cbd8f25d7842&login=true&scope=openidOIDC认证授权登录基于OIDC(OAuth)增强版)2.0Authentication授权方式。只有正确填写用户名和密码,才能得到对/foo/bar的正确响应。总结请注意:这是一个系列文章,请点击文章开头的#keycloak查看已有章节。我们只通过少量的配置就实现了OIDC的认证授权,实现了对SpringBoot接口的保护,非常简单。但是看完这篇文章,你会有很多疑问,因为你对OIDC协议还不是很了解。这个协议非常重要,各大厂商都在使用这个协议。下一篇文章将为您补课此协议。本文DEMO已上传至Git,可关注公众号:码农小胖哥回复keycloak3获取DEMO。大量的点赞、重看、转发、评论、吃饭,是胖哥创作和分享的原动力。本文转载自微信公众号“码农小胖哥”,可通过以下二维码关注。转载本文请联系码农小胖公众号。