聊聊Web项目中的权限设计
一般的Web项目中都少不了登录这个环节,登录之后就需要跳转到首页,并且根据
当前用户的信息,获取到对应的菜单信息,可以操作的方法信息等等。这个只是针对于
操作权限,至于数据权限处理起来会更加复杂一些。自己从以往开发过的项目中,来聊
聊权限系统的设计思路。
软件开发中已经大量使用的,稳定的权限设计思路就是,给用户授予某个角色,然后
找到这个角色所拥有的权限,就是这个角色所对应的用户的权限。简单的几张表就可以
实现这个功能,用户表,角色表,权限资源表,用户角色表(一对多),角色权限表(多对多)。
使用这几张表就可以完成系统的权限设计,一个用户可以有多个角色,一个角色可以对应
多个资源。权限资源表中又可以分为多种权限资源,比如菜单资源,比如曾、删、改、查的
按钮资源。用户是否有权限查看某个菜单,用户是否有权限操作某个按钮对应的方法,都被
严格控制。权限已经控制到方法级别,粒度已经很小而且很实用。
介绍完上面的权限设计思路之后,在来聊一聊具体的实现方式。首先可以使用注解的方式
去给每一个方法添加操作权限比如说给A方法添加权限A。然后前端页面登录之后,拿到当前
用户对应的所有权限资源,对每一个菜单和每一个按钮都添加了对应的权限编码,用户登录
系统之后,有这个权限编码则显示某一个菜单或者是某个操作方法,没有就不显示。这在页面
中就已经过滤掉许多可能越权的操作,如果是碰到懂行的人,那就需要使用第二种方式来进行
鉴权操作。既然给某个用户授权可以登录某一个系统,那么首先用户信息肯定是存在于系统当
中的。如果系统中不存在当前操作的某个用户信息,那一定就是没有权限去做这个操作。后端
的处理方式为,使用一个AOP切面来进行统一处理,拦截所有controller方法中有权限注解的
方法。会先根据用户的唯一信息从缓存当中获取当前用户对应的所有权限,然后判断所有权限中
是否存在权限A,存在则放行。不存在则直接返回或者是抛出异常信息,中断程序的执行。
至此从权限设计到具体的实现思路都已经写明, 自己之前开发过的项目中很多系统都是使用
这种方式来设计的,简单实用。有其他建议的小伙伴欢迎留言讨论。