Shiro动态修改权限部分
来源:互联网 发布:数学作图软件 编辑:程序博客网 时间:2024/05/17 12:51
简介
通过修改shiroFilter的class来实现。通过继承org.apache.shiro.spring.web.ShiroFilterFactoryBean类,并把继承类配置到shiro的配置文件中既可。
FilterChainDefinitionsService.java
package com.shiro;import java.util.Map;import javax.annotation.Resource;import org.apache.shiro.util.CollectionUtils;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.stereotype.Service;@Service("filterChainDefinitionsService")public class FilterChainDefinitionsService { @Resource private ShiroPermissionFactory permissionFactory; public void reloadFilterChains() { synchronized (permissionFactory) { //强制同步,控制线程安全 AbstractShiroFilter shiroFilter = null; try { shiroFilter = (AbstractShiroFilter) permissionFactory.getObject(); PathMatchingFilterChainResolver resolver = (PathMatchingFilterChainResolver) shiroFilter .getFilterChainResolver(); // 过滤管理器 DefaultFilterChainManager manager = (DefaultFilterChainManager) resolver.getFilterChainManager(); // 清除权限配置 manager.getFilterChains().clear(); permissionFactory.getFilterChainDefinitionMap().clear(); // 重新设置权限 permissionFactory.setFilterChainDefinitions(ShiroPermissionFactory.definition);//传入配置中的filterchains Map<String, String> chains = permissionFactory.getFilterChainDefinitionMap(); //重新生成过滤链 if (!CollectionUtils.isEmpty(chains)) { chains.forEach((url, definitionChains) -> { manager.createChain(url, definitionChains.trim().replace(" ", "")); }); } } catch (Exception e) { e.printStackTrace(); } } }}
ShiroPermissionFactory.java
package com.shiro;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.annotation.Resource;import org.apache.shiro.config.Ini;import org.apache.shiro.spring.web.ShiroFilterFactoryBean;import org.apache.shiro.util.CollectionUtils;import org.apache.shiro.web.config.IniFilterChainResolverFactory;import com.pojo.Permission;import com.service.IPermissionService;public class ShiroPermissionFactory extends ShiroFilterFactoryBean {@Resourceprivate IPermissionService permissionService;/** 记录配置中的过滤链 */public static String definition = "";/** * 初始化设置过滤链 */@Overridepublic void setFilterChainDefinitions(String definitions) {definition = definitions;// 记录配置的静态过滤链List<Permission> permissions = permissionService.getPermissions();Map<String, String> otherChains = new HashMap<String, String>();permissions.forEach(permiss -> {otherChains.put(permiss.getUrl(), permiss.getName());});otherChains.put("/**", "authc");// 加载配置默认的过滤链Ini ini = new Ini();ini.load(definitions);Ini.Section section = ini.getSection(IniFilterChainResolverFactory.URLS);if (CollectionUtils.isEmpty(section)) {section = ini.getSection(Ini.DEFAULT_SECTION_NAME);}// 加上数据库中过滤链section.putAll(otherChains);setFilterChainDefinitionMap(section);}}
shiro部分配置文件
<!-- 配置shiro的过滤器工厂类,id- shiroFilter要和我们在web.xml中配置的过滤器一致 --><bean id="shiroFilter" class="com.shiro.ShiroPermissionFactory"><!-- 调用我们配置的权限管理器 --><property name="securityManager" ref="securityManager" /><!-- 配置我们的登录请求地址 --><property name="loginUrl" value="/login.jsp" /><!-- 配置我们在登录页登录成功后的跳转地址,如果你访问的是非/login地址,则跳到您访问的地址 --><property name="successUrl" value="/Adduser.jsp" /><!-- 如果您请求的资源不再您的权限范围,则跳转到/403请求地址 --><property name="unauthorizedUrl" value="/unauthorized" /><property name="filters"><util:map><entry key="logout" value-ref="logoutFilter" /></util:map></property><!-- 权限配置 --><property name="filterChainDefinitions"><value>/login=anon/icon/**=anon/js/**=anon/logout=logout</value></property></bean><bean id="logoutFilter" class="org.apache.shiro.web.filter.authc.LogoutFilter"><property name="redirectUrl" value="/login.jsp" />
PermissionServiceImpl.java
package com.serviceImpl;import java.util.List;import javax.annotation.Resource;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Isolation;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;import com.dao.PermissionMapper;import com.pojo.Permission;import com.service.IPermissionService;import com.shiro.FilterChainDefinitionsService;@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 5)@Service("permissionService")public class PermissionServiceImpl implements IPermissionService {@Resourceprivate FilterChainDefinitionsService definitionService;@Resourceprivate PermissionMapper permissionmapper;public Permission createPermission(Permission permission) {permissionmapper.addpermission(permission);definitionService.reloadFilterChains();//重新加载权限过滤链return permission;}public void deletePermission(int permissionId) {permissionmapper.deletepermission(permissionId);definitionService.reloadFilterChains();//重新加载权限过滤链}public List<Permission> getPermissions() {return permissionmapper.getPermissions();}public Permission getPermissionByid(int permissionid) {return permissionmapper.getPermissionByid(permissionid);}public Permission updatePermission(Permission permission) {permissionmapper.updatePermission(permission);definitionService.reloadFilterChains();//重新加载权限过滤链return permission;}public void deletePermissions(int permissionId) {permissionmapper.deletePermissionsByid(permissionId);definitionService.reloadFilterChains();//重新加载权限过滤链}}
3 0
- Shiro动态修改权限部分
- Shiro动态修改权限
- shiro 用户权限修改 动态更新权限 重新赋值权限
- shiro实现动态权限管理
- shiro安全框架扩展教程--如何动态修改资源权限不需要重启项目
- shiro 动态修改资源权限不需要重启项目或者重新登录用户
- shiro学习--从数据库获取动态权限
- 《权限系列shiro+cas》----修改cas的默认登录页
- Shiro学习(19)动态URL权限限制
- Apache Shiro动态设置权限可对应访问路径
- springmvc中shiro拦截权限动态写入功能
- Shiro 权限动态加载与配置精细讲解
- shiro框架之动态URL权限控制 十九
- ANDROID6.0权限部分动态申请
- Shiro教程(十)Shiro 权限动态加载与配置精细讲解
- java鬼混笔记:shiro 5、shiro授权判断,基本动态获取权限
- 【Shiro】SpringMVC+Shiro权限管理
- shrio动态修改权限,解决重启
- linux中pip安装步骤与使用详解
- 打印输出语句:System.out.println("内容"+i+1+"内容");与System.out.println("内容"+(i+1)+"内容");的区别
- A*算法图解
- 整合SSH框架
- 线形索引查找
- Shiro动态修改权限部分
- springmvc静态文件访问路径
- Intel Edision安装Android Things
- Arduino简单实例十一_四脚三色LED灯
- Android Studio在SVN上为什么要创建分支、如何创建分支跟合并分支、以及报错处理
- SmartRoute之远程接口调用和负载
- 在tslib移植中,出现tslib: Selected device is not a Linux input event device
- 资料
- iOS项目技巧+封装过程