# 获取菜单

设工程根路径为http://localhost:8080fly-web模块定义了/menushttp://localhost:8080/menus作为获取菜单的规范接口,可供Fly Vue前端框架对接侧边菜单等场景使用。

# 启用接口

由于是拓展功能,且菜单配置项支持由身份权限管理是否生效,使用时需要在启动类或配置类添加@EnableWebApp注解开启该功能:

import fly.web.EnableWebApp;

@SpringBootApplication
@EnableWebApp
public class DemoApplication {...}

注意,只有存在classpath:web/menus.yml配置文件时才会生成菜单接口,简单示例如下:

src/main/resources/web/menus.yml

menus:
  - title: 工作台
    icon: md-book
    path: /work
  - title: 用户管理
    icon: md-body
    path: /user/list

访问接口返回:

menus: [
    {
        "title": "工作台",
        "icon": "md-book",
        "path": "/work"
    },
    {
        "title": "用户管理",
        "icon": "md-body",
        "path": "/user/list"
    }
]

# 动态权限

为需要根据某些特定条件,如当前请求携带的身份信息等判断属性或对象是否返回,框架支持设置特定表达式来进行权限控制,常用场景如:根据用户或客户端拥有的SCOPE权限判断,显示不同的菜单。

具体处理流程为:

  • 为属性设置表达式,通过属性名或方法获取每次请求的身份信息,表达式使用具体可见表达式规则说明,yaml文件支持添加行注释和json格式写法:
  1. 行注释#
menus:
  - menu1 #scope_admin
  - title: menu2
    children: #scope_admin
      - title: child1

menu1以及menu2下的children列表属性需满足权限才能显示。

  1. 对于对象,可配置$secured属性:
menus: [
  {
    "title": "menu1",
    "$secured": "scope_admin"
  }
]

menus列表下的第一个对象需满足权限才能显示。

  • 工程启动,将表达式解析为spel表达式;

  • 请求访问,计算表达式,若返回true则表示生效。

# 表达式规则

表达式最终会解析为spel表达式,表达式计算结果需为布尔值。表达式中可调用fly.security.authz.method.ExtendedMethodSecurityExpressionRoot类属性或方法,或使用框架提供的简化写法:

  • 特殊前缀,不区分大小写
  1. scope_ - 相当于hasScope(),表示需要拥有指定SCOPE权限;
  2. role_ - 相当于hasRole(),表示需要拥有指定角色;
  3. perm_ - 相当于hasPermission(),表示需要满足指定权限表达式。

需要注意的是,上述简写不适用于复杂表达式,多重判断时需要转换回原来的写法:

// 需拥有 admin 权限且当前租户值为 default
// 此时 hasScope('admin') 不能简写为 scope_admin
hasScope('admin') && 'default'.equals(authentication.tokenAttributes.tenant_id)

其他常见表达式有:

表达式 说明
isAuthenticated() 是否已身份认证
isAnonymous() 是否匿名
hasAnyScope('scope1', 'scope2') 是否拥有其中一个SCOPE权限
getAuthentication() 获取当前请求身份信息

其他可取值可见fly.security.authz.method.ExtendedMethodSecurityExpressionRoot类。

顶部