Spring Boot Web应用集成Keycloak进阶之细粒度权限控制(java 细粒度锁)

  本篇文章为你整理了Spring Boot Web应用集成Keycloak进阶之细粒度权限控制(java 细粒度锁)的详细内容,包含有细粒度访问控制 java 细粒度锁 细粒度访问 细粒度缓存 Spring Boot Web应用集成Keycloak进阶之细粒度权限控制,希望能帮助你了解 Spring Boot Web应用集成Keycloak进阶之细粒度权限控制。

   前面的文章讲过Spring Boot应用集成Keycloak实现统一身份验证、权限控制的方法,其中权限控制的部分直接使用Role进行判断,这种方式对于简单的系统来说也够用。但是对于复杂的需要集成细粒度权限控制的系统,显然只是单纯的依靠Role直接控制的方式是不合适的,并且应用本…

  
 

   前面的文章讲过Spring Boot应用集成Keycloak实现统一身份验证、权限控制的方法,其中权限控制的部分直接使用Role进行判断,这种方式对于简单的系统来说也够用。但是对于复杂的需要集成细粒度权限控制的系统,显然只是单纯的依靠Role直接控制的方式是不合适的,并且应用本身与Role直接耦合的方式也很不灵活。本文讲述Spring Boot的Web应用如何集成Keycloak实现细粒度权限控制。

  Keycloak核心权限概念综述

  Keycloak支持细粒度权限控制策略,可以组合使用如下不同的访问控制机制:

  Attribute-based access control (ABAC)

  Role-based access control (RBAC)

  User-based access control (UBAC)

  Context-based access control (CBAC)

  Rule-based access control

  Time-based access control

  Keycloak授权处理流程

  如果要使用Keycloak的细粒度权限控制,主要有3个流程需要了解:

  资源管理(Resoucre Management)

  权限和策略管理(Permission and Policy Management)

  策略执行(Policy Enforcement)

  资源管理主要用来定义资源服务器的哪些对象需要被保护

  其中资源服务、资源、范围(Scope)关系如下:

  权限和策略管理(Permission and Policy Management)

  策略是来定义满足哪些条件才可以访问资源,不过策略本身并不与资源关联。要想策略实际作用在相应的资源上,就需要配置权限,将要保护的资源及策略进行关联。

  策略执行需要在资源服务内集成一个Policy Enforcement Point(PEP,资源执行点),以便与Keycloak服务进行通信获取相关的权限信息等,从而决定哪些资源可以被访问。

  Keycloak细粒度权限控制后台配置

  要想启用Keycloak的细粒度权限控制,需要先创建相应的客户端,并启用授权服务。然后根据上面的授权处理流程,进行资源管理、权限和策略管理的配置。本文模拟如下场景来进行配置,以便更好的理解配置内容。

  场景如下:

  需要被保护的应用有/admin、/customer/view、/customer/delete三个主要资源

  拥有ROLE_ADMIN角色的用户可以访问所有资源

  拥有ROLE_CUSTOMER角色的用户仅可以访问/customer/view,其他资源不能访问

  接下来便看下针对如上模拟的场景,在Keycloak后台具体要如何配置。

  创建角色及用户

  
配置资源、策略及权限

  在客户端的Authorization Tab下,有很多子的选项卡,可以对资源、策略及权限进行配置。

  Settings选项卡配置

  Settings选项卡下的是关于授权的一些全局默认配置

  这里说明下Settings下面的2个重要配置

  
Enforcing:当资源没有配置关联的策略时,请求默认被拒绝访问,这也是默认的选项

  Permissive:当资源没有配置关联的策略时,请求允许访问

  Disabled:禁用所有资源的所有访问策略

  
Resources选项卡配置

  Resoucres选项卡主要是用来配置需要保护的资源。本示例中配置如下几个资源,注意下Scopes的设置

  Authorization Scopes选项卡配置

  Policies选项卡配置

  Policies下主要配置哪些策略,配置的策略用来在权限设置中与资源进行关联,Keycloak本身支持很多策略,详细的策略说明可参考官方文档,本示例中使用最常使用的基于角色(Role Based)的策略

  Permissions选项卡配置

  Permission下就是用来配置资源、策略如何进行关联,并且在有多个策略关联时采用何种策略(Decision Strategy)最终决定资源是否能被授权,Decision Strategy的配置项与上文Settings下的意义相同,在此不再赘述

  Spring Boot项目集成Keycloak代码配置示例

  application.yml Keycloak配置

  

keycloak:

 

   realm: demo

   auth-server-url: http://127.0.0.1:8080/auth

   resource: spring-boot-authz-keycloak-web

   ssl-required: external

   credentials:

   secret: dede7fd6-2817-491c-b7e5-27f65bbb5fc7

   use-resource-role-mappings: false

   bearer-only: false

   autodetect-bearer-only: false

   security-constraints:

   - authRoles:

   - ROLE_USER

   securityCollections:

   - name: all

   patterns:

   - /*

   policy-enforcer-config:

   on-deny-redirect-to: /accessDenied

  复制代码

配置文件说明可参考之前的文章,这里主要说下,有policy-enforcer-config配置项,表明当前应用启用细粒度权限控制,on-deny-redirect-to表示当访问被拒绝时跳转的地址

 

  Controller示例代码

  

@RequestMapping(value = /customer/view , method = {RequestMethod.GET})

 

  public String customerView(Model model, HttpServletRequest request) {

   KeycloakSecurityContext keycloak = (KeycloakSecurityContext) request.getAttribute(KeycloakSecurityContext.class.getName());

   model.addAttribute( authz , keycloak.getAuthorizationContext());

   return customer/view

  @RequestMapping(value = /customer/delete , method = {RequestMethod.GET, RequestMethod.POST})

  public String customerDelete(Model model, HttpServletRequest request) {

   KeycloakSecurityContext keycloak = (KeycloakSecurityContext) request.getAttribute(KeycloakSecurityContext.class.getName());

   model.addAttribute( authz , keycloak.getAuthorizationContext());

   return customer/delete

  @RequestMapping(value = /admin , method = {RequestMethod.GET, RequestMethod.POST})

  public String admin(Model model, HttpServletRequest request) {

   KeycloakSecurityContext keycloak = (KeycloakSecurityContext) request.getAttribute(KeycloakSecurityContext.class.getName());

   model.addAttribute( authz , keycloak.getAuthorizationContext());

   return admin/view

  @RequestMapping(value = /admin/delete , method = {RequestMethod.GET, RequestMethod.POST})

  public String adminDelete(Model model, HttpServletRequest request) {

   KeycloakSecurityContext keycloak = (KeycloakSecurityContext) request.getAttribute(KeycloakSecurityContext.class.getName());

   model.addAttribute( authz , keycloak.getAuthorizationContext());

   return admin/delete

  @RequestMapping(value = /accessDenied , method = {RequestMethod.GET, RequestMethod.POST})

  public String accessDenied() {

   return access_denied

  复制代码

示例Controller主要是将Keycloak的授权上下文传给model,并指定相应的视图渲染

 

  customer/view.ftl页面示例代码

  

 h1 Customer View /h1 

 

   div

   #if authz.hasScopePermission( delete )

   a href= /customer/delete delete /a

   /#if

   /div

  复制代码

页面使用freemarker,都比较简单,当然也可以使用其他视图引擎,此处仅贴出这一个页面的示例代码,只有拥有delete Scope的权限才能够看到delete链接

 

  项目效果演示

  customer用户访问效果

  访问/customer/view页面,看不到delete链接

  访问/custome/delete、/admin页面,直接跳转/accessDenied页面

  admin用户访问效果

  admin用户访问/customer/view页面,可以看到delete链接

  admin用户点击delete链接或者直接访问/customer/delete,都可以正常显示页面

  admin用户可以正常访问/admin相关页面

  本文简单的介绍了Keycloak细粒度权限相关的概念,并以一个简单的模拟场景展示了如何配置Keycloak后台以及Spring Boot Web类型的应用,从而实现实际的细粒度权限控制。Keycloak本身针对细粒度权限相关的策略非常灵活,可根据实际场景的需要选择甚至组合多种策略灵活配置。

  本文示例项目代码:spring-boot-authz-keycloak-web

  
本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
 

   本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
 

   [Spring Boot Web应用集成Keycloak进阶之细粒度权限控制]http://www.zyiz.net/tech/detail-141309.html

  以上就是Spring Boot Web应用集成Keycloak进阶之细粒度权限控制(java 细粒度锁)的详细内容,想要了解更多 Spring Boot Web应用集成Keycloak进阶之细粒度权限控制的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: