项目后端是基于 RESTful 风格的 API ,前端是基于 AngularJS 的静态页面。身份校验使用 JWT 来做,但是对于资源的控制这块儿有一些疑问。
例如前端每一个按扭或者操作都有调用对应的接口,这个对应的接口都是前端写好的。我知道这个接口调用是肯定是要在后端做权限校验的,但是不能让用户去操作了才告诉他有没有权限。也就是说在用户登录后,哪个接口有权限哪个没权限UI上就已经控制了是否显示,主要是这块儿应该是不知道如何更好的实现?
我现在能想到就是在用户登录后,把用户有权限操作的接口全部返回给前端,然后前端根据接口是否包含在列表中来控制 UI 上的按钮是否显示(AngularJS 能否实现?)。因为没有这样项目的经验,所以总觉得这样做有些别扭。是不是还有其他实现方案?
     1 
                    
                    lrj2u      2016-05-11 00:26:26 +08:00 
                    
                    我用过 shiro 做权限管理,把用户对应的角色权限打包好,登录时候发给前端。前端封装一个指令,用来控制是否显示。 
                需要权限控制的按钮加一个自定义的字符串,与权限列表做比较,如果有的话就显示。 页面的话也简单,我之前的项目是使用了 ngroute ,在每个页面下加了自定义的权限字符串,跳转页面之前检查用户的权限列表是否有这个字符串,有的话就显示。  | 
            
     2 
                    
                    immjun      2016-05-11 00:30:31 +08:00 
                    
                    
                 | 
            
     3 
                    
                    incompatible      2016-05-11 00:52:41 +08:00 via iPhone 
                    
                    @lrj2u 后端难道不再加一层权限检验?如果不加的话,伪造的 http 客户端可以轻易绕开你的限制。 
                 | 
            
     4 
                    
                    Perry      2016-05-11 00:58:09 +08:00 via iPhone 
                    
                    ng-show="Ctrl.isLoggedIn()" 类似这种? 
                 | 
            
     5 
                    
                    ayaseangle      2016-05-11 01:11:06 +08:00 
                    
                    看 github 的 api 是把权限元数据返回给前端。。 
                 | 
            
     6 
                    
                    yyfearth      2016-05-11 02:26:51 +08:00 
                    
                    
                 | 
            
     7 
                    
                    Felldeadbird      2016-05-11 08:22:17 +08:00 via iPhone 
                    
                    可以基于路由加请求方式进行绑定权限。 
                 | 
            
     8 
                    
                    gevin      2016-05-11 08:30:34 +08:00 
                    
                    前后台都要有权限相关逻辑,页面上的权限逻辑由前端来实现,后台只要保证 api 只能被符合权限的用户使用即可,前端是表现,后台是双保险 
                 | 
            
     9 
                    
                    murmur      2016-05-11 08:30:48 +08:00 
                    
                    后端权限校验随便写个拦截器就可以做了 简单点的 
                复杂一点的 比如数据绑定 流程绑定 这些 估计啥框架都做不了必须手写代码  | 
            
     10 
                    
                    lrj2u      2016-05-11 09:11:50 +08:00 
                    
                    @incompatible 后端当然加啊,后端是用了 shiro 的注解方式,没有权限的话用 filter 返回统一的警告信息。 
                 | 
            
     11 
                    
                    LukeXuan      2016-05-11 09:14:05 +08:00 
                    
                    提供 permission 信息在 GET /session 内 angular 先请求 /session 解析权限然后生成前端网页 
                 | 
            
     12 
                    
                    cheng007      2016-05-11 09:14:09 +08:00 
                    
                    token=时间;授权信息;账号;等等;,服务端给 token 一次加密传给客户端。 
                 | 
            
     13 
                    
                    marvinwilliam      2016-05-11 09:16:57 +08:00 
                    
                    登录页面单独用服务器页面来做,用户登录之后再根据权限输出页面,这样算不算 
                 | 
            
     14 
                    
                    lygmqkl      2016-05-11 10:25:21 +08:00 via iPad 
                    
                    我谈谈我的做法,在 icrawler.yiilib.com 里所有的权限校验发生在 restful api 中,权限通过就是 200 ,权限不通过就是 403 AngularJS 只负责响应,说实话在客户端校验权限没有任何意义。 
                再说服务器端用的是 RBAC 每个用户对应 role , role 对应 resource operation 最后说 cs 通信就是 accesstoken ,但是这里面依然有 token 被窃取的危险并非 100% 安全,但是在此之上已经开发了更高级的策略来应对 复杂的商用场景,当然这也超过了本次讨论的范围 大概是这样,希望能抛砖引玉  | 
            
     15 
                    
                    lygmqkl      2016-05-11 10:32:40 +08:00 
                    
                    后半个问题,考虑开一个接口 响应用户的 权限,返回一个 mapping 然后 angularJS 保存到 rootScope 中, render 的时候调用,应该 ok 。 
                 | 
            
     17 
                    
                    lygmqkl      2016-05-11 11:09:47 +08:00 
                    
                    @graetdk 推广很头疼,目前租房还没开放,只是二手房模块,如果确定现在就要邀请码 可以再 at 我一下,我给你发一个。 
                 | 
            
     18 
                    
                    graetdk      2016-05-11 11:14:48 +08:00 
                    
                    @lygmqkl  说实话,我觉得你的项目目前来看只适合有技术基础的用户理解和使用,如果想推广开,很多内容都要优化,文案,教程,操作方式等等。等租房开放了之后再给我一个邀请码哇: [email protected] 多谢 
                 | 
            
     19 
                    
                    guyskk      2016-05-11 12:21:18 +08:00 
                    
                    权限本身也可以作为一个资源。 
                可以直接返回权限信息,前端获取后自己判断用户有没有权限,也可以只返回 true/false ,前端传递想要调用的接口信息,像这样`GET /permit?resource=user&action=put -> {"permit": true/false}`。  | 
            
     20 
                    
                    shawnwang      2016-05-11 20:37:03 +08:00 
                    
                    前端对需要权限控制的按钮外包一层[自定义标签],如<button:permission/>,标签上预设一个权限 id, 在 db 中绑定了权限 id 和 role 之间的关系,通过传递权限 ID 来判断是否有权限或是否显示按钮。 
                 | 
            
     21 
                    
                    dawncold      2016-05-11 21:41:43 +08:00 
                    
                    获取哪些权限可见的 ajax 可以改成同步的,这样就能在渲染之前确定哪些权限是可见的。 
                 |