Shiro过滤器与权限设置

       前言

        Shiro对于Web类型的软件项目,Shiro框架的内部运行强烈依赖于Servlet技术规范中的Filter(过滤器),因此内部提供了包括认证、授权、管理等各个环节非常多的过滤器。因此了解过滤器及配置规则尤其重要。


过滤器链与拦截规则

upload successful

以上是Shiro中的一些重要的过滤器。不过最终都是继承在Filter接口、而Filter接口是在javax.servlet;包中。

  1. NameableFilter

    给 Filter 起个名字,如果没有设置默认就是 FilterName;还记得之前的如 authc 吗?当我们组装拦截器链时会根据这个名字找到相应的拦截器实例。

  2. OncePerRequestFilter

    用于防止多次执行 Filter 的;也就是说一次请求只会走一次拦截器链;另外提供enabled 属性,表示是否开启该拦截器实例,默认 enabled=true 表示开启,如果不想让某个拦截器工作,可以设置为 false 即可。大部分 Shiro 过滤器都是该过滤器的子类。

  3. ShiroFilter

    是整个 Shiro 框架的入口点,用于拦截需要安全控制的请求进行处理。

  4. AdviceFilter

    提供了 AOP 风格的支持,类似于 SpringMVC 中的 Interceptor(拦截器)提供的preHandler 方法类似于 AOP 中的前置增强;在拦截器链执行之前执行;如果返回 true 则继续拦截器链;否则中断后续的拦截器链的执行直接返回;进行预处理(如基于表单的身份验证、授权);postHandle 方法类似于 AOP 中的后置返回增强;在拦截器链执行完成后执行;进行后处理(如记录执行时间之类的);afterCompletion 方法类似于 AOP 中的后置最终增强;即不管有没有异常都会执行;可以进行清理资源(如接触 Subject 与线程的绑定之类的)。

  5. PathMatchingFilter

    提供了基于 Ant 风格的请求路径匹配功能及拦截器参数解析的功能,如“roles[admin,user]”自动根据“,”分割解析到一个路径参数配置并绑定到相应的路径。

  6. AccessControlFilter

    提供了访问控制的基础功能;比如是否允许访问/当访问拒绝时如何处理等。isAccessAllowed 方法表示是否允许访问;mappedValue 就是[urls]配置中拦截器参数部分,如果允许访问返回 true,否则 false;onAccessDenied 方法表示当访问拒绝时是否已经处理了;如果返回 true 表示需要继续处理;如果返回 false 表示该拦截器实例已经处理了,将直接返回即可;onPreHandle 方法会自动调用这两个方法决定是否继续处理。如果我们想进行访问访问的控制就可以继承 AccessControlFilter;如果我们要添加一些通用数据我们可以直接继承 PathMatchingFilter。

  • 内置过滤器

    Shiro内置了很多默认的过滤器,比如身份验证、授权等相关的。默认过滤器可以参考org.apache.shiro.web.filter.mgt.DefaultFilter 中的枚举。而这些默认的过滤器。默认都是开启状态。可以直接在 ini 配置文件中通过 “拦截器名. 属性” 设置其属性。

    upload successful

    如果不想使用某个拦截器,可以直接通过如下配置直接禁用:

    //禁用perms权限
    perms.enabled=false
默认过滤器名 指定类名 说明
认证过滤器
authc FormAuthenticationFilter—基于表单的过滤器; 如“/**=authc”没有登录会跳到相应页登录;主要属性:usernameParam:表单提交的用户名参数;passwordParam:表单提交的密码参数;rememberMeParam:表单提交叫记住我;loginUrl:登录页地址;successUrl登录成功后的默认重定向地址;failureKeyAttribute:登录失败后错误信息存储key(shiroLoginFailure);
authc Basic BasicHttpAuthenticationFilter—HTTP身份验证过滤器 主要属性:applicationName:弹出登录框显示的信息(application);
logout LogoutFilter—退出过滤器 主要属性:redirectUrl:退出成功后重定向的地址(/);示例“/logout=logout”
user UserFilter—用户过滤器 用户已经身份验证/记住我登录的都可;示例 “/**=user
anon AnonymousFilter—匿名过滤器 即不需要登录即可访问;一般用于静态资源过滤;示例 “/static/**=anon
授权过滤器
roles RolesAuthorizationFilter—角色授权过滤器 验证用户是否拥有所有角色;主要属性:loginUrl:登录页面地址(/login.jsp);unauthorizedUrl:未授权后重定向的地址;示例“/admin/**=roles[admin]
perms PermissionsAuthorizationFilter—权限授权过滤器 验证用户是否拥有所有权限;属性和 roles 一样;示例“/user/**=perms["user:create"]
host HostFilter—即主机过滤器 比如其提供了属性:authorizedIps:已授权的 ip 地址,deniedIps:表示拒绝的 ip 地址;不过目前还没有完全实现,不可用。
port PortFilter—端口过滤器 主要属性:port(80):可以通过的端口;示例 “/test= port[80]”,如果用户访问该页面是非 80,将自动将请求端口改为80并重定向到该80端口,其他路径/参数等都一样
rest HttpMethodPermissionFilter—rest风格过滤器 自动根据请求方法构建权限字符串(GET=read, POST=create,PUT=update,DELETE=delete,HEAD=read,TRACE=read,OPTIONS=read, MKCOL=create)构建权限字符串;示例“/users=rest[user]”,会自动拼出“user:read,user:create,user:update,user:delete”权限字符串进行权限匹配(所有都得匹配,isPermittedAll);
ssl slFilter—SSL过滤器 只有请求协议是https才能通过;否则自动跳转会 https 端口(443);其他和port过滤器一样;
其它过滤器
noSessionCreati on NoSessionCreationFilter—不创建会话过滤器 调用 subject.getSession(false)不会有什么问题,但是如果subject.getSession(true)将抛出DisabledSessionException 异常;
  • 拦截规则语法

    同过前面的示例可知,Shiro 过滤器链的拦截规则在 ini 文件、Java 代码、properties 文件、Spring XML 中都可以配置,本质上都是 Key-Value 的写法。

    SpringBoot配置类添加权限规则

    upload successful

    SpringXML添加权限规则

    upload successful

    .ini配置添加权限规则

    upload successful

    对于权限中的还有一些属性,可以使用过滤器名.属性的方式使用属性。如:perms.unauthorizedUrl=/unauthorized