说明: 本系统采用security+oauth2作为安全框架主要完成了登陆认证丶权限分配丶url的拦截。
一丶oauth2登陆及请求说明
系统测试登陆账号:admin
系统测试登陆密码:12345
登陆url: http://localhost:8120/oauth/token
指定参数:
username,
password,
grant_type,
scope,
client_id,
client_secret
参数说明: username丶password为登陆账号和密码,grant_type为验证类型,scope用于授权方给应用授权,client_id用于授权方标识应用程序,client_secret用于验证应用身份,后四个参数的值和配置文件保持一致即可。
完整url: http://localhost:8120/oauth/token?username=admin&password=12345&grant_type=password&scope=all&client_id=client_2&client_secret=huidu_erp_security
登陆系统时需要通过以上oauth2指定的登陆接口进行token的获取。
登陆成功后返回以上信息,在访问系统其它接口时需要在请求头中携带access_token对应的value,例:(注意bearer后面的空格不能省略)
二丶公共资源配置
如果有接口只需要登陆后就可以访问,那么此类接口我们将它定义为公共接口,再resource表中添加对应的资源信息后将is_common设置为1即可。
path字段说明: 资源路径包括请求方式和资源地址,若同一个接口有多个路径可以用;号隔开(注意资源路径不能为空)。
三丶url配置
本系统资源共分为4级且4级资源为末级单位(ps:编辑功能为4级权限,但编辑功能内还调用了其它接口,那么此时需要将编辑功能内调用的所有接口都和编辑功能配置到一起,多个url用“;”号隔开),为方便表资源的可读性每级资源依靠首位数字标识该资源。(ps:一级资源的id为100,101…100,1001,1002以此类推)
resource_label:资源标识,前端用。
resource_name:为资源名称。
annotation:资源备注,方便直接查看资源表时增加可读性。
parent_id:父级资源的id
resource_type:资源类型,分为MENU,BUTTON
is_common:设置公共资源(公共资源默认登陆后的用户都有权限访问)0:代表不是公共资源,1:代表是公共资源。
例:
多权限配置:如编辑账号功能,点击编辑时进入边界页面需要获取角色列表的信息,那么此时就需要将角色列表对应的url和账号编辑的url配到一起。
四丶权限变更主要事项
当修改了角色权限后需要重新登录,因为只有在登录的时候才会重新获取角色权限!
当数据库表增加了公共接口后,需要重启程序!
五丶拦截策略
登陆:用户输入账号密码后调用Security自带的“/oauth/token”认证接口,该接口自动调用loadUserByUsername()这个方法,该方法为实现UserDetailsService
接口后重写的方法,此接口功能为根据用户名将用户信息查询出来并返回给Security,然后Security会拿用户输入的用户名和密码去和loadUserByUsername()返回的用户信息进行比对,如果比对成功则返回token。
Url资源拦截:
configure()方法的功能是拦截校验url,当用户发送一个请求后首先会进入该方法,首先判断该资源是否为开放资源或登陆认证后的默认资源,如果该请求不属于以上资源类型那么系统判断该当前用户是否拥有本次请求资源的权限。
hasPermission()该方法的作用就是获取当前请求的url和当前用户所拥有的权限进行比较,如果用户包含请求资源那么返回true,如果不包含则返回false。
六丶特殊资源配置
当系统中存在不需要登陆且请求路径的请求头中不包含TENANT-ID时,我们可以在doFilter()方法中进行判断,当请求头中不包含TENANT-ID时,则判断本次请求的url地址是否匹配自己所期望的地址,如果符合给TENANT-ID默认赋值。
七丶补充说明
7.1关于系统权限只有4级问题的说明:
首先本系统将权限共分为四级,并不意味不能添加第5级6级菜单,将系统权限分为四级的原因是因为当时根据erp1.0的原型划分最多也就能分出四级。
例:根据上图所示首先系统分为6大模块,“销售管理”属于其中之一也就是一级资源, “销售管理”下有“客户管理”丶“收货地址”丶“客户合同”这些属于二级资源,“客户管理”下有“客户资料”为三级资源(ps:因为用户再点击客户资料时,页面会跳到客户资料展示页同时会请求客户资料查询接口,所以我们需要将客户资料查询接口配到这个资源下),“客户资料”下又包含具体的编辑丶新建丶详情功能这些均属于四级资源,比如客户编辑页面中包含选择角色的功能,那么为什么没有继续分出第五级资源呢?原因是因为当用户拥有了编辑功能时,就会默认用户拥有在编辑时需要用到的所有权限,(ps:假设我作为一个用户我勾选了编辑功能那么我在编辑客户的时候却不能给客户选择角色这就会显得很奇怪。)这也是系统设计之初就与产品经理约定好的规则。
7.2关于系统如何设置5级资源甚至更加细分的资源?
如果系统中遇到了必须要设置的5级资源,那么我们只用在resource表中添加id为5开头的资源然后指定父级资源为四级资源即可。(ps:之所以要将id开头设为5没有其它含义只是为了查看resource时增加可读性)同理我们要设置六级资源时,那么我们就在resource表中设置id为6开头并将父级id指定为五级资源即可。