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
原创粉丝点击