数据表关系
涉及数据表
关联关系
关联关系 | 关联表 | 关联字段 |
用户角色关联 | USER_ROLE | id |
角色菜单关联 | ROLE_MENU | id |
后端接口
涉及实体
菜单类(Menu)
public class Menu { private Integer id; private String url; private String path; private String component; private String name; private String iconCls; private List
children; private List menuRoles; private Meta meta; private Integer parentId; private Boolean enabled; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url == null ? null : url.trim(); } public String getPath() { return path; } public void setPath(String path) { this.path = path == null ? null : path.trim(); } public String getComponent() { return component; } public void setComponent(String component) { this.component = component == null ? null : component.trim(); } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public String getIconCls() { return iconCls; } public void setIconCls(String iconCls) { this.iconCls = iconCls; } public Integer getParentId() { return parentId; } public void setParentId(Integer parentId) { this.parentId = parentId; } public Boolean getEnabled() { return enabled; } public void setEnabled(Boolean enabled) { this.enabled = enabled; } public Meta getMeta() { return meta; } public void setMeta(Meta meta) { this.meta = meta; } public List
getChildren() { return children; } public void setChildren(List
children) { this.children = children; } public List getMenuRoles() { return menuRoles; } public void setMenuRoles(List menuRoles) { this.menuRoles = menuRoles; }}
菜单额外信息(Meta)
public class Meta { private Boolean keepAlive; private Boolean requireAuth; public Boolean getKeepAlive() { return keepAlive; } public void setKeepAlive(Boolean keepAlive) { this.keepAlive = keepAlive; } public Boolean getRequireAuth() { return requireAuth; } public void setRequireAuth(Boolean requireAuth) { this.requireAuth = requireAuth; }}
角色信息(Role)
public class Role { private Integer id; private String name; private String nameZh; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public String getNameZh() { return nameZh; } public void setNameZh(String nameZh) { this.nameZh = nameZh; }}
MenuMapper.xml
获取登录用户
SecurityContext
SpringSecurity中使用SecurityContext保存当前通过认证的登录用户信息(Authentication,包含当前登录用户及用户权限)。
public interface SecurityContext extends Serializable { Authentication getAuthentication(); void setAuthentication(Authentication var1);}
setAuthentication(Authentication):用于在安全上下文(SecurityContext)中设置通过认证的登录用户信息。
getAuthentication():用于在安全上下文(SecurityContext)中获取通过认证的登录用户信息。
SecurityContextHolder
SecurityContextHolder为工具类,用于保存安全上下文(SecurityContext)对象,在SecurityContextHolder中通过getContext()获取安全上下文。
public static SecurityContext getContext() { return strategy.getContext(); }
获取到安全上下文(SecurityContext)后,通过.getAuthentication().getPrincipal()从SpringSecurity中获取当前登录用户对象。
((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal())
根据登录人员查询可访问菜单资源
MenuMapper
List
getMenuByHrId(Integer hrId);
MenuMapper.xml
<select id="getMenuByHrId" resultMap="Menus2"> select DISTINCT m1.*,m2.component as component2,m2.enabled as enabled2,m2.iconCls as iconCls2,m2.keepAlive as keepAlive2,m2.`name` as name2,m2.parentId as parentId2,m2.requireAuth as requireAuth2,m2.path as path2 from menu m1,menu m2,user_role urole,menu_role mr where m1.id=m2.parentId and urole.userid=#{userid} and urole.rid=mr.rid and mr.mid=m2.id and m2.enabled=true ORDER BY m1.id,m2.id select>
对用户角色关联表(user_role)、角色菜单关联表(menu_role)、菜单表(menu)进行关联查询,获取当前登录用户可访问菜单资源。先根据登录用户标识(从SpringSecurity中获取当前登录用户,获取用户标识),从user_role表根据用户标识匹配用户对应角色(role_id);在根据角色标识(role_id)从menu_role表匹配角色对应拥有的访问菜单权限。
MenuService
public List
getMenuByHrId() { /** * 从SpringSecurity中获取当前登录用户,根据当前登录用户获取用户Id * SecurityContextHolder.getContext() * .getAuthentication().getPrincipal():从SpringSecurity中获取当前登录用户对象 */ return menuMapper.getMenuByHrId(((User) SecurityContextHolder.getContext() .getAuthentication().getPrincipal()).getId()); }
导航菜单加载接口
@RestController@RequestMapping("/system/menuInit")public class MenuInitController { @Autowired MenuService menuService; @RequestMapping("/initMenu") public List
getMenuByHrId() { return menuService.getMenuByHrId(); }}