权限配置用户的权限配置主要分两种一种就是给用户分配角色不同的角色有不同的操作权限。另外一种就是直接分配能够操作的权限该方式权限的颗粒度更小权限分配更精细化。在不同的场景下两种权限配置都要用到。准备工作如果我们要学习用户的权限配置那么我们首先要清楚用户与角色权限之间的关系也就是说如果有用户表角色表权限表这三个表之间的关系是什么呢不难理解用户表和角色表之间应该是多对多也就是说一个用户可以有多个角色那么同时一个角色可以对应多个用户。角色表与权限表之间也应该是多对多也就是说一个角色可以有多个权限那么同时一个权限也可以对应多个角色。如图一、角色权限配置1.1 创建表用户表用户角色关系表角色表1.2 通过逆向工程生成通过逆向工程生成t_role的相关实体mapper及映射文件1.3 角色权限需求用户登录认证成功 -- 给用户配置角色 -- 给角色配置能访问的资源1.4 角色权限步骤1、需要有一个用户从数据库查询用户2、给用户配置角色从数据库查询用户的角色3、给角色配置能访问的资源这一步采用切面拦截使用的是注解RBAC (基于角色的访问控制)常用注解如下PreAuthorize 在方法调用前进行权限检查;常用PostAuthorize 在方法调用后进行权限检查;很少用如果需要如上两个注解生效需要在security的配置类上添加如下注解使其生效EnableMethodSecurity注解的详细用法PreAuthorize(hasRole(xxx))和PreAuthorize(hasAuthority(xxx))都是用于方法级权限控制的注解但它们在权限标识的处理上存在关键区别核心在于角色Role和权限Authority的语义与格式差异。PreAuthorize(hasRole(admin))一般用来做角色的授权行为PreAuthorize(hasAuthority(xxx))一般来做资源的授权定位本质区别角色与权限的语义hasRole(角色名)专门用于判断用户是否拥有某个角色。Spring Security 会自动为角色名添加前缀ROLE_默认配置因此实际校验的权限是ROLE_角色名。比如某个用户拥有角色为admin那么框架实际验证的是ROLE_admin因此我们需要在做角色授权的时候自己加上ROLE_。 这是因为Spring Security框架内的DefaultMethodSecurityExpressionHandler在验证表达式时是有”ROLE_”前缀的。hasAuthority(权限名)用于判断用户是否拥有某个具体权限。不会对权限名做任何处理直接校验用户是否包含该权限字符串。可以自定义前缀1.5 具体实现如果需要看某个用户是否拥有某个角色我们是不是应该有一个数据库查询根据用户id查询角色信息呢而逆向工程中是没有这个操作的因为这是一个联表查询TRoleMapper中添加通过用户id查询角色信息的抽象方法1.5.1 根据用户id查询角色信息1.5.2 映射文件1.5.3 给用户配置角色1.5.4 自定义Service赋值角色1.5.5 自定义Controller相关方法创建新的ProductController进行测试注意需要在配置类中添加注解表示开启注解支持测试结果如下当前访问 http://localhost:8080/index1 地址时先进行用户的认证用户认证成功后获取用户的详细信息由于liutao是销售员当访问 http://localhost:8080/product/list 请求时发现可以正常访问当访问 http://localhost:8080/product/add 请求时发现可以正常访问当访问 http://localhost:8080/product/del 请求时发现无法正常访问说明没有权限以上是我们使用liutao用户去测试的该用户有saler角色但是没有admin角色。1.5.6 定义错误页面再次访问 http://localhost:8080/product/del 请求时发现无法正常访问时跳转到权限不足的403页面。二、资源权限配置数据表设计(权限表),(权限和角色的中间表)剩下的和角色配置大致一致不同的是注解使用PreAuthorize(hasAuthority(xxx))就可以了步骤逆向工程生成权限的实体Mapper接口 和 映射添加方法通过用户ID查询所有的权限(5表联合查询)/同样在用户实体中添加权限的集合给用户配置权限 用户实体中/自定义service中添加controller相关方法测试逆向工程2.1 Mapper编写以及映射文件Mapper接口Mapper映射文件2.2 给用户配置权限2.2.1 给实体User中添加临时的权限集合属性2.2.2 给用户授予权限2.2.3 给User实体中的权限集合赋值通过数据库查询然后给属性赋值2.2.4 设定场景测试测试结果如下当前访问 http://localhost:8080/index1 地址时先进行用户的认证用户认证成功后获取用户的详细信息证成功后可以看到 liutao 当前用户的权限 有 增改查 权限操作没有删除权限。先测试下 增改查 的某一个功能http://localhost:8080/goods/list 结果如下图通过测试 http://localhost:8080/goods/del 删除功能时结果如下图此时发现当前用户尚未拥有删除权限无法执行删除操作。