V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
muyunn
V2EX  ›  Java

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

  •  
  •   muyunn · 2020-05-14 00:04:24 +08:00 · 3659 次点击
    这是一个创建于 1647 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

    另外, security 的动态权限挺难搞, 我目前的方法还得用反射拿到 SecurityMetadataSource 中的 map 才能真正动态修改权限配置(改完不用重启应用的那种). 楼主用的什么方法实现的动态配置能否请教一下
    muyunn
        8
    muyunn  
    OP
       2020-05-14 12:15:38 +08:00
    @darrenfang 嗯嗯,按钮所需要的权限得写死吧
    muyunn
        9
    muyunn  
    OP
       2020-05-14 12:16:32 +08:00
    @woncode 本来以为挺简单,自己动手做好多问题
    muyunn
        10
    muyunn  
    OP
       2020-05-14 12:17:46 +08:00
    @xuanbg 嗯嗯,在理,后端如果要动态,请求的 url 和 method 就应该也存起来
    muyunn
        11
    muyunn  
    OP
       2020-05-14 12:18:54 +08:00
    @yisheyuanzhang 权限表不存 url 的话,后端就无法实现动态更新权限了
    muyunn
        12
    muyunn  
    OP
       2020-05-14 12:20:57 +08:00
    @90d0n 我的思路目前跟你的差不多,secutity 感觉有点重了,我也是刚接触,还没开始实现,等我实现完成再回复你
    mmdsun
        13
    mmdsun  
       2020-05-14 19:23:52 +08:00 via Android
    页面是完整的页面。然后 vue 写 if 判断这个按钮是否显示。在登录的时候按钮权限由服务器返回。 我的权限表设计比较乱,没有抽出菜单表。里面是有 URL 的。权限表 resourceType 字段来区分 button 还是 menu 都有。系统菜单也是后台接口返回的。
    darrenfang
        14
    darrenfang  
       2020-05-14 19:24:46 +08:00 via iPhone
    @muyunn 按钮上权限是写死的,只是控制隐藏和显示罢了。我的权限表没存 url,我觉得 url 是开发时就确定好的,后期也不需要更改,所以就用静态字段来代替了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   974 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 20:42 · PVG 04:42 · LAX 12:42 · JFK 15:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.