【Shiro】Shiro自定义过滤器Filter
本文最后更新于 1403 天前,其中的信息可能已经有所发展或是发生改变。

引言

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

知识点

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

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

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

教程

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

2.系统的默认授权器。

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

Controller.java

    //添加上如下的代码
    @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配置的文件。

ShiroConfiguration.java

//注意添加的内容要在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)写自定义的类。

RolesOrFilter.java

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进行测试。

Controller.java

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

3)修改shiro配置文件。

把部分放了出来,对照添加就行。
ShiroConfiguration.java

//配置自定义的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.部分效果图:

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇