一只倔强的笨猪

【Shiro】Shiro自定义过滤器Filter

自定义过滤器Filter这里只给部分的案例代码,因为比较简单。可以依据本站的Shiro注解授权修改一下就可以理解知识点了。

知识点

管理全部过滤器,包括默认的关于身份验证和权限验证的过滤器,这些过滤器分为两组,一组是认证过滤器,有anon,authcBasic,auchc,user,logout 一组是授权过滤器,有perms,roles,ssl(https),rest,port(端口)。同时也包含在xml里filters配置的自定义过滤器。在其它地方使用时都是从过滤器管理类里filters里拿的。且过滤器是单例的,整个Shiro框架只维护每种类型过滤器的单例。

自定义认证过滤器就继承AuthenticatingFilter。
自定义授权过滤器就继承AuthorizationFilter。

这里我给的例子就是自定义授权过滤器。

1.创建数据库导入Maven这些就参考上面的那一篇文章。

2.系统的默认授权器。

1)编写对应的Controller进行测试。

	//添加上如下的代码
	@RequestMapping("roles1")
    @ResponseBody
    public String roles1(){
        return "拥有admin角色";
    }

    @RequestMapping("roles2")
    @ResponseBody
    public String roles2(){
        return "拥有admin和user角色";
    }

    @RequestMapping("permission1")
    @ResponseBody
    public String permission1(){
        return "拥有user:update权限";
    }

    @RequestMapping("permission2")
    @ResponseBody
    public String permission2(){
        return "拥有user:update和user:select权限";
    }

2)修改shiro配置的文件。

//注意添加的内容要在filterChainDefinitionMap.put("/**","authc");这句之前。
filterChainDefinitionMap.put("/roles1", "roles[admin]");
filterChainDefinitionMap.put("/roles2", "roles[admin,user]");
filterChainDefinitionMap.put("/permission1", "perms[user:update]");
filterChainDefinitionMap.put("/permission2", "perms[user:update,user:select]");

3)测试下就会发现roles2和permission2都是会被拦截的。因为必须同时有两个角色或者两个权限。

3.自定义授权过滤器。

1)写自定义的类。

package com.benzhu.shiro.Filter;

import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class RolesOrFilter extends AuthorizationFilter {

    @Override
    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
        Subject subject = getSubject(servletRequest,servletResponse);
        String[] roles = (String[]) o;
        if(roles == null || roles.length == 0){
            return false;
        }
        for (String role : roles){
            if(subject.hasRole(role)){
                return true;
            }
        }
        return false;
    }
}

2)编写对应的Controller进行测试。

	//添加上如下的代码
	@RequestMapping("roles3")
    @ResponseBody
    public String roles3(){
        return "拥有admin或者user角色";
    }

3)修改shiro配置文件。
把部分放了出来,对照添加就行。

	//配置自定义的Filter
	Map<String, Filter> filtersMap = new LinkedHashMap<String, Filter>();
	filtersMap.put("roleOrFilter", new RolesOrFilter());
	bean.setFilters(filtersMap);
	//配置访问权限
	LinkedHashMap<String, String> filterChainDefinitionMap=new LinkedHashMap<>();
	filterChainDefinitionMap.put("/login", "anon");
	filterChainDefinitionMap.put("/sublogin", "anon");
	filterChainDefinitionMap.put("/usererror", "anon");
	filterChainDefinitionMap.put("/roles1", "roles[admin]");
	filterChainDefinitionMap.put("/roles2", "roles[admin,user]");
	filterChainDefinitionMap.put("/permission1", "perms[user:update]");
	filterChainDefinitionMap.put("/permission2", "perms[user:update,user:select]");
	filterChainDefinitionMap.put("/roles3", "roleOrFilter[admin,user]");
	filterChainDefinitionMap.put("/**","authc");
	bean.setFilterChainDefinitionMap(filterChainDefinitionMap);

4)测试下就会发现登陆后roles3是可以访问的。

4.部分效果图:
《【Shiro】Shiro自定义过滤器Filter》

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注