# 获取菜单
设工程根路径为http://localhost:8080,fly-web模块定义了/menus即http://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格式写法:
- 行注释
#:
menus:
- menu1 #scope_admin
- title: menu2
children: #scope_admin
- title: child1
menu1以及menu2下的children列表属性需满足权限才能显示。
- 对于对象,可配置
$secured属性:
menus: [
{
"title": "menu1",
"$secured": "scope_admin"
}
]
menus列表下的第一个对象需满足权限才能显示。
工程启动,将表达式解析为
spel表达式;请求访问,计算表达式,若返回
true则表示生效。
# 表达式规则
表达式最终会解析为spel表达式,表达式计算结果需为布尔值。表达式中可调用fly.security.authz.method.ExtendedMethodSecurityExpressionRoot类属性或方法,或使用框架提供的简化写法:
- 特殊前缀,不区分大小写
scope_- 相当于hasScope(),表示需要拥有指定SCOPE权限;role_- 相当于hasRole(),表示需要拥有指定角色;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类。