权限概述
权限概念
“权”:能做的事情
“限”:限制
对登录系统的用户进行操作、行为方面的限制,对项目中的功能进行保护,让没有权力访问的用户不能访问。
具体概念
资源
项目中被保护的功能就是资源。
资源可以体现为多种形式:
- URL地址
http://localhost:8080/oa/save/emp.html - Java方法
AdminServiceImpl.saveAdmin() - 页面元素
<a href="xxx">Show Something secret</a>
<form ...
<img ...
根据资源保护方式不同,可以把权限控制分成两部分:
- 粗粒度权限控制
使用类似Filter或Interceptor这样的机制,在项目运行的宏观层面从总体上控制每一个请求是否有权限访问一个资源。 - 细粒度权限控制
把用户不能操作的功能隐藏起来,让用户看不到不能访问的资源。
权限(狭义)
将完成一个功能所需要使用到的各个资源封装到一起,作为整体分配给用户,用户才能够完整使用这个功能。
封装到一起的多个资源称为权限(狭义)。
角色
角色可以看做用户分组,同一个角色就是相同类别的用户划分到一起。将相同类别的用户放在一起,统一操作就可以简化功能开发、简化系统管理员操作。
在比较复杂的功能需求下,角色会进一步细分。
用户
使用系统的人登录系统时使用的账号、密码。尚筹网项目中有两大类用户:
登录后台管理系统的用户:Admin
登录前台会员系统的用户:Member
用户可以看做使用系统的人在操作系统中具体功能的时候的具体身份。系统根据这个身份记录日志、控制权限。
关联关系
权限→资源
数据库表:多对多关系
- 一个权限往往包含多个资源
- 一个资源很有可能会被分配给多个不同权限
Java类:单向
- 关心一个权限中包含哪些资源,所以Java类方面权限对象能够获取到包含的资源即可。
- 不关心一个资源被分配给哪些权限了
角色→权限
数据库表:多对多关系
- 一个角色使用系统时会用到很多具体功能,这些功能必须都有权限才可以。
- 一个权限往往会被分配给多个不同角色。
Java类:单向
- 关心一个角色包含哪些权限,需要通过角色对象获取对应的权限。
- 不关心权限被分配给了哪些角色。
用户→角色
数据库表:多对多关系
- 一个角色是用户分类,同一个分类下往往包含很多具体用户。
- 一个用户有可能身兼数职,同时具备多个角色。
Java类:双向
- 关心角色中包含哪些用户。有可能在管理用户数据时列出某个角色下所有用户。
- 关心用户包含哪些角色,从而决定这个用户是否可以访问某个资源。
数据库中表示多对多
结论:需要用到中间表
如果不使用中间表
如果使用中间表
中间表设置主键方式
方案一:另外设置专门字段
方案二:使用联合主键
两个字段(或多个字段)联合起来共同构成主键。构成联合主键的具体字段可以有重复值,联合主键合并的值不能重复。