|
@@ -10,6 +10,10 @@ import net.chenlin.dp.modules.sys.dao.SysRoleMenuMapper;
|
|
|
import net.chenlin.dp.modules.sys.dao.SysUserMapper;
|
|
|
import net.chenlin.dp.modules.sys.entity.SysMenuEntity;
|
|
|
import net.chenlin.dp.modules.sys.service.SysMenuService;
|
|
|
+import net.chenlin.dp.modules.sys.shiro.ShiroPermsFilterFactoryBean;
|
|
|
+import org.apache.shiro.web.filter.mgt.DefaultFilterChainManager;
|
|
|
+import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver;
|
|
|
+import org.apache.shiro.web.servlet.AbstractShiroFilter;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
@@ -33,6 +37,9 @@ public class SysMenuServiceImpl implements SysMenuService {
|
|
|
@Autowired
|
|
|
private SysRoleMenuMapper sysRoleMenuMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private ShiroPermsFilterFactoryBean shiroFilterFactory;
|
|
|
+
|
|
|
/**
|
|
|
* 查询用户权限菜单
|
|
|
* @param userId
|
|
@@ -134,6 +141,10 @@ public class SysMenuServiceImpl implements SysMenuService {
|
|
|
@Override
|
|
|
public R saveMenu(SysMenuEntity menu) {
|
|
|
int count = sysMenuMapper.save(menu);
|
|
|
+ // 刷新权限链
|
|
|
+ if (count > 0) {
|
|
|
+ reloadShiroPermsChain();
|
|
|
+ }
|
|
|
return CommonUtils.msg(count);
|
|
|
}
|
|
|
|
|
@@ -156,6 +167,10 @@ public class SysMenuServiceImpl implements SysMenuService {
|
|
|
@Override
|
|
|
public R updateMenu(SysMenuEntity menu) {
|
|
|
int count = sysMenuMapper.update(menu);
|
|
|
+ // 刷新权限链
|
|
|
+ if (count > 0) {
|
|
|
+ reloadShiroPermsChain();
|
|
|
+ }
|
|
|
return CommonUtils.msg(count);
|
|
|
}
|
|
|
|
|
@@ -172,6 +187,10 @@ public class SysMenuServiceImpl implements SysMenuService {
|
|
|
}
|
|
|
int count = sysMenuMapper.batchRemove(id);
|
|
|
sysRoleMenuMapper.batchRemoveByMenuId(id);
|
|
|
+ // 刷新权限链
|
|
|
+ if (count > 0) {
|
|
|
+ reloadShiroPermsChain();
|
|
|
+ }
|
|
|
return CommonUtils.msg(id, count);
|
|
|
}
|
|
|
|
|
@@ -190,4 +209,36 @@ public class SysMenuServiceImpl implements SysMenuService {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 重新加载shiro权限责任链
|
|
|
+ */
|
|
|
+ private void reloadShiroPermsChain() {
|
|
|
+ //强制同步,控制线程安全
|
|
|
+ synchronized (shiroFilterFactory) {
|
|
|
+ AbstractShiroFilter shiroFilter;
|
|
|
+ try {
|
|
|
+ shiroFilter = (AbstractShiroFilter) shiroFilterFactory.getObject();
|
|
|
+
|
|
|
+ PathMatchingFilterChainResolver resolver = (PathMatchingFilterChainResolver) shiroFilter.getFilterChainResolver();
|
|
|
+ // 过滤管理器
|
|
|
+ DefaultFilterChainManager manager = (DefaultFilterChainManager) resolver.getFilterChainManager();
|
|
|
+ // 清除权限配置
|
|
|
+ manager.getFilterChains().clear();
|
|
|
+ shiroFilterFactory.getFilterChainDefinitionMap().clear();
|
|
|
+ // 重新设置权限,传入配置中的默认的filterChains
|
|
|
+ shiroFilterFactory.setFilterChainDefinitionMap(ShiroPermsFilterFactoryBean.DEFAULT_CHAIN_MAP);
|
|
|
+
|
|
|
+ Map<String, String> chains = shiroFilterFactory.getFilterChainDefinitionMap();
|
|
|
+ //重新生成过滤链
|
|
|
+ if (!chains.isEmpty()) {
|
|
|
+ for (Map.Entry<String, String> entry : chains.entrySet()) {
|
|
|
+ manager.createChain(entry.getKey(), entry.getValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|