权限管理RBAC基于角色的访问控制
1.实体对应关系
用户>>>>>>用户-角色>>>>>>角色
角色>>>>>>角色-权限>>>>>>资源
2.权限表设计
多对多关系时为五个表
用户>>>>>>用户-角色关系表>>>>>>角色表>>>>>>角色-资源关系表>>>>>>资源表
3.根据请求的url判断角色(以java为例)
a.实体类中添加角色列表(角色是确定的,用户是变化的)
@ApiModelProperty(value = "角色列表") @TableField(exist = false) private List<Role> roles;
b.在接口和实现类中编写根绝角色获取菜单列表和接口和实现过程方法
//根据角色获取菜单列表 List<Menu> getMenusWithRole();
c.mapper中添加方法,代码与上相同
d.在xml中编写sql语句
<!--根据角色获取菜单列表--> <select id="getMenusWithRole" resultMap="MenusWithRole"> SELECT m.*, r.id as rid, r.`name`as rname, r.nameZh as rnameZh FROM t_menu m, t_menu_role mr, t_role r WHERE m.id = mr.mid AND r.id = mr.rid ORDER BY m2.id </select>
配置xml的resultMap
<resultMap id="MenusWithRole" type="com.xxxx.server.pojo.Menu" extends="BaseResultMap">
<collection property="roles" ofType="com.xxxx.server.pojo.Role">
<id column="rid" property="id"/>
<result column="rname" property="name" />
<result column="rnameZh" property="nameZh" />
</collection>
</resultMap>
e.在config中配置过滤器,根据请求url请求所需要的角色
@Component public class CustomeFilter implements FilterInvocationSecurityMetadataSource { @Autowired private IMenuService menuService; AntPathMatcher antPathMatcher = new AntPathMatcher(); @Override public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException { //获取请求的url String requestUrl = ((FilterInvocation) object).getRequestUrl(); List<Menu> menus = menuService.getMenusWithRole(); for (Menu menu : menus) { //判断请求url和惨淡角色是否匹配 if(antPathMatcher.match(menu.getUrl(), requestUrl)){ String[] str = menu.getRoles().stream(). map(Role::getName).toArray(String[]::new); return SecurityConfig.createList(str); } } //未匹配的url默认登录即可访问 return SecurityConfig.createList("ROLE_LOGIN"); }