spring boot + spring security + vue 动态权限如何实现

2020-05-14 00:04:24 +08:00
 muyunn

我想实现精确到按钮级别的权限,但是不知道权限表应该存储哪些信息?

1.权限表应不应该存储前端路由信息 权限表添加路由信息,然后动态返回给前端,可是感觉如果有按钮级别的权限,是不是后端动态返回路由也没有什么意义呢?(按钮级别的权限前端应该把权限写死然后判断吧)

2.权限表应不应该存储 url 信息 这块想的是启动项目自动加载所有 url 对应的权限信息,而不需要在每个 controller 方法上添加注解

请问大家实际项目中权限都是如何实现的呢?

3687 次点击
所在节点    Java
14 条回复
chihiro2014
2020-05-14 00:08:08 +08:00
这类资料蛮多的啊,你好好学下 spring security 然后再看看 jwt 就行
darrenfang
2020-05-14 00:30:14 +08:00
之前开发的 app 做法是提供 api 查询用户所有的权限,然后在每个按钮上做下判断。

后来开发的一个 app 不需要细化到按钮的权限,就提供了一个 api 查询导航栏。
woncode
2020-05-14 01:52:03 +08:00
精确到按钮级别的权限控制,我也一直找不到最称心的实现方式,最流行的 rbac 模型不行,它只能控制到资源级别,也就是 api 级别

我认为这种按钮级别根本不适合使用前后端分离的方案,而是后端完全渲染成 html 后,再直接发给浏览器,所以需要使用前端模板引擎,比如 thymeleaf

如果一定要使用 mvvm 的话,我目前看到 angular 的路由守卫功能还可以,不知道 vue 有没有类似的方案
evenIfAlsoGo
2020-05-14 08:47:41 +08:00
@woncode vue router 有路由守卫,全局的,路由的,组件的。( https://router.vuejs.org/zh/guide/advanced/navigation-guards.html
xuanbg
2020-05-14 09:11:20 +08:00
先说前端,虽然是假权限,但也是需要根据用户权限来显示 /隐藏对应的操作按钮,或者更进一步显示 /隐藏相关组件。

后端既然楼主要求动态,那么鉴权就不能通过注解来实现了。你可以通过拦截器或者干脆在网关上面实现鉴权。思路无非就是通过解析 token 来获取用户信息,然后根据用户信息来鉴权。
yisheyuanzhang
2020-05-14 09:23:15 +08:00
权限表:权限路由(对于菜单)/权限 code(用于按钮), 权限类型(菜单 or 按钮) 上级 id
1 、前端根据后端返回的信息,展示菜单。 抽出权限 code,用于控制按钮的显示和隐藏(前端控制按钮显示隐藏,后端也要校验)
2 、权限表不存 url,Controller 方法上加权限 code 的注解来校验
90d0n
2020-05-14 09:27:13 +08:00
1. 存路由 存按钮权限.按钮级别的目前没有找到称心的办法. 现在就是再前端埋点写死的按钮权限, 然后调用后端接口返回用户具体的权限列表;

2. 存 url. 做动态权限的话, security 动态加载权限时, 没有 url 怎么匹配具体哪个 url 有什么权限.

另外, security 的动态权限挺难搞, 我目前的方法还得用反射拿到 SecurityMetadataSource 中的 map 才能真正动态修改权限配置(改完不用重启应用的那种). 楼主用的什么方法实现的动态配置能否请教一下
muyunn
2020-05-14 12:15:38 +08:00
@darrenfang 嗯嗯,按钮所需要的权限得写死吧
muyunn
2020-05-14 12:16:32 +08:00
@woncode 本来以为挺简单,自己动手做好多问题
muyunn
2020-05-14 12:17:46 +08:00
@xuanbg 嗯嗯,在理,后端如果要动态,请求的 url 和 method 就应该也存起来
muyunn
2020-05-14 12:18:54 +08:00
@yisheyuanzhang 权限表不存 url 的话,后端就无法实现动态更新权限了
muyunn
2020-05-14 12:20:57 +08:00
@90d0n 我的思路目前跟你的差不多,secutity 感觉有点重了,我也是刚接触,还没开始实现,等我实现完成再回复你
mmdsun
2020-05-14 19:23:52 +08:00
页面是完整的页面。然后 vue 写 if 判断这个按钮是否显示。在登录的时候按钮权限由服务器返回。 我的权限表设计比较乱,没有抽出菜单表。里面是有 URL 的。权限表 resourceType 字段来区分 button 还是 menu 都有。系统菜单也是后台接口返回的。
darrenfang
2020-05-14 19:24:46 +08:00
@muyunn 按钮上权限是写死的,只是控制隐藏和显示罢了。我的权限表没存 url,我觉得 url 是开发时就确定好的,后期也不需要更改,所以就用静态字段来代替了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/671427

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX