shiro 方法级别细粒度权限控制_Spring Boot Web应用集成Keycloak进阶之细粒度权限控制...

本文讲述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)

资源管理

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

faf9a72065c89ed3f97d57df67d9df47.png

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

c66cce58065792a6a23481aae2d5a51a.png

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

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

590ab9b2e4b58c3e62145ccbe596ce6a.png

策略执行

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

c7bc2dd89c7f175d1f3d1e8cf1f79b59.png

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

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

场景如下:

  • 需要被保护的应用有 /admin 、 /customer/view 、 /customer/delete 三个主要资源
  • 拥有 ROLE_ADMIN 角色的用户可以访问所有资源
  • 拥有 ROLE_CUSTOMER 角色的用户仅可以访问 /customer/view ,其他资源不能访问

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

创建角色及用户

  1. 创建3个角色,其中 ROLE_USER 给所有用户都进行绑定
  2. 创建2个用户并绑定角色

创建客户端并启用授权服务

  1. 新建客户端
  2. 设置 confidential 访问类型,并启用授权

配置资源、策略及权限

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

Settings选项卡配置

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

6f3b53c8cc1cfb0c91011e8aca01fd2f.png

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

  • Policy Enforcement Mode:指定授权服务器接受到请求时策略如何执行Enforcing:当资源没有配置关联的策略时,请求默认被拒绝访问,这也是默认的选项Permissive:当资源没有配置关联的策略时,请求允许访问Disabled:禁用所有资源的所有访问策略
  • Decision Strategy:表示权限最终是如何计算的策略,以决定相应的资源是否能获得授权Affirmative :至少一个权限计算做出正向决定Unanimous:所有的权限计算都要做出正向决定

Resources选项卡配置

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

346e4d6a1769763c051e1498f5712bbc.png
893d1a60fca4adc00116f679e31ae438.png
d206f66524fce0d5c00a11487821bdc5.png
7c3681a8bf8fce5366e93264cde67d9b.png

Authorization Scopes选项卡配置

3e6be4239fe16045b7b83a76ac29766e.png

Policies选项卡配置

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

f83ce1b1eca357697210d9d173d24286.png
40f522b9ae84851b1f9494d3fae3f9e4.png
5cf1a300eb2f16dba4d37cf32995b329.png

Permissions选项卡配置

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

1841659c78e0004d2d916ba53e4439bc.png
e84bd755dd6012aa7177bcebe42820c0.png
6f46a206944637cd506215f9a2d9bf8f.png
d193b6b68475b8fe9f38a3bc68f300ed.png

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页面示例代码

Customer View

delete #if>
复制代码

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

项目效果演示

customer用户访问效果

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

4793b3b5e52db416aced15668c66f2ee.png

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

91ac3cacf473be39c85e8dac5610df5c.png

admin用户访问效果

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

f39611997cb17d82a38653c5da741b72.png

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

ef053d5e81777ffb07d25fb11bfe7849.png

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

0ed11bd4963d06b8b1236d76a2572768.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值