Java实现权限管理的思路

权限管理分析

每个网站都涉及到访问权限的控制。每个站点资源都需要被管理起来,用户只有具有访问某个资源的特定权限,才能够访问,否则就被拒绝访问。网站的访问权限控制,一种方法从 URL 入手,站点的每个资源都用唯一的 URL 描述,我们为想要管理起来的 URL 增加上权限属性,当用户访问资源时我们要先检查用户是否具有权限。采用拦截器技术实现权限拦截,进行判断,有权限即可访问,没有就阻止。另一种方法是采用入口有无的形式来做,根据后台数据判断有权限则在界面上有权限入口,没有权限则没有入口。

权限数据库设计

数据库采用如下设计,总共由5张表组成,用户表、角色表、资源表、用户角色表和角色资源表。一个用户可以拥有多个角色,一个角色拥有多个资源。

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `username` varchar(32) DEFAULT NULL COMMENT '用户名',
  `password` varchar(32) DEFAULT NULL COMMENT '密码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';

CREATE TABLE `role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL COMMENT '角色名',
  `desc` varchar(32) DEFAULT NULL COMMENT '角色描述',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色表';

CREATE TABLE `resource` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `title` varchar(32) DEFAULT NULL COMMENT '资源标题',
  `uri` varchar(32) DEFAULT NULL COMMENT '资源uri  ',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='资源表';

CREATE TABLE `user_role` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_id` int(11) NOT NULL COMMENT '用户id',
  `role_id` int(11) NOT NULL COMMENT '角色id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户角色表';

CREATE TABLE `role_resource` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `role_id` int(11) DEFAULT NULL COMMENT '角色id',
  `resource_id` int(11) DEFAULT NULL COMMENT '资源id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色资源表';


拦截URL实现权限管理

通过 URL 进行请求,由拦截器进行拦截,根据用户的信息,去数据库中查询此用户是否具有本次请求的 URL 权限,如果有就通过请求,让他访问资源,如果没有就返回,提示用户不具有该资源的访问权限。

按钮级别的权限管理

比如后台的菜单按钮,每一个按钮对应的是一个资源。在显示按钮的时候,可以通过后台先查询此用户具有哪些资源的访问权限,然后根据对应的权限显示对应的按钮。此方法可以做到按钮级别的权限控制。

web网页,还可以同过自定义标签来实现入口的控制。比如:

<diy:power value="${url}"><a>权限按钮</a></diy:power>

此标签根据 value,在后台查询数据库去判断是否具有权限,来决定标签内容是否显示。


本文永久更新地址:https://github.com/nnngu/LearningNotes/blob/master/_posts/2018-03-20-Java%E5%AE%9E%E7%8E%B0%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86%E7%9A%84%E6%80%9D%E8%B7%AF.md