shiro安全框架扩展教程--如何自定义适合项目的过滤器

简介:         上一章节我给大家讲了如何设计扩展动态修改shiro的资源而不用重启项目,这个章节我讲的是如何自定义我们的特殊过滤器讲到认证这一块,我们经常用到就是authc,roles,...

        上一章节我给大家讲了如何设计扩展动态修改shiro的资源而不用重启项目,这个章节我讲的是如何自定义我们的特殊过滤器


讲到认证这一块,我们经常用到就是authc,roles,perms这三个标签,说到底标签其实就是一个map的key,然后指向filter实例,相信大家都懂这个了,所以我就不啰嗦,下面我们看看roles的filter实现类


package org.apache.shiro.web.filter.authz;

import java.io.IOException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.CollectionUtils;

// Referenced classes of package org.apache.shiro.web.filter.authz:
//            AuthorizationFilter

public class RolesAuthorizationFilter extends AuthorizationFilter
{

    public RolesAuthorizationFilter()
    {
    }

    public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
        throws IOException
    {
        Subject subject = getSubject(request, response);
        String rolesArray[] = (String[])(String[])mappedValue;
        if(rolesArray == null || rolesArray.length == 0)
        {
            return true;
        } else
        {
            java.util.Set roles = CollectionUtils.asSet(rolesArray);
            return subject.hasAllRoles(roles);
        }
    }
}

我们可以看到其实这个roles的filter是通过subject.hasAllRoles(roles)判断是否满足所有权限,但是我们真实项目中,很多时候用户只要满足其中一个角色即可认为是授权认证成功,所以这个时候,我们首先想到的是再写个filter吧,那我们下面就写个满足任一角色即可放行的授权认证类


public class RoleAuthorizationFilter extends AuthorizationFilter {

	public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
			throws IOException {

		Subject subject = getSubject(request, response);
		String[] rolesArray = (String[]) mappedValue;

		if (rolesArray == null || rolesArray.length == 0) {
			// no roles specified, so nothing to check - allow access.
			return true;
		}

		Set<String> roles = CollectionUtils.asSet(rolesArray);
		for (String role : roles) {
			if (subject.hasRole(role)) {
				return true;
			}
		}
		return false;
	}

}


很简单的样子,其实就是从RolesAuthorizationFilter这个类copy一份代码过来,然后把subject.hasAllRoles()换成遍历调用subject.hasRole()方法,如存在任一角色则返回true即可


最后我们把这个filter要配置到主过滤器里,并且定义标签为role


<!-- 过滤链配置 -->
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" />
		<property name="loginUrl" value="/" />
		<property name="successUrl" value="/cms/index.do" />
		<property name="unauthorizedUrl" value="/" />
		<property name="filters">
			<map>
				<entry key="role">
					<bean
						class="com.silvery.security.shiro.filter.RoleAuthorizationFilter" />
				</entry>
				<entry key="authc">
					<bean
						class="com.silvery.security.shiro.filter.SimpleFormAuthenticationFilter" />
				</entry>
			</map>
		</property>
	</bean>

象上述配置就是使用自定义过滤器,如: /test/** = role[admin]  或者  /test/** = role[admin,user] 这样用户拥有任一定义的角色都能认证成功

由上述的自定义filter可以看出,我们在shiro上增加其他filter并不难,所以如果需要增加其他filter就不需要担心实现不了...



相关文章
|
10月前
|
springboot项目中使用shiro 自定义过滤器和token的方式
springboot项目中使用shiro 自定义过滤器和token的方式
220 1
SpringMVC进阶-校验框架
SpringMVC进阶-校验框架
81 0
[Spring] Web层AOP方式进行参数校验
Spring的AOP方式有很多用途,本次记录其使用AOP的方式处理Controller层参数校验问题 思路 使用 Hibernate validator 注解式参数校验 利用AOP织入Controller层方法,在参数校验完成后检查BindingResult里的校验结果 代码 AOP类 package com.
1503 0
Spring Security系列教程10--基于自定义数据库模型实现授权
前言 在上一个章节中,一一哥 给大家讲解了如何基于默认的数据库模型来实现认证授权,在这种模型里,用户的信息虽然是保存在数据库中的,但是有很多的限制!因为我们必须按照源码规定的方式去建库建表,存在灵活性不足的问题。而我们真正开发时,用户角色等表肯定要根据自己的项目需求来单独设计,所以我们有必要进行用户及角色表的自定义设计。 那么在本篇文章中,壹哥 就带各位,结合自己的实际项目需求,进行数据库和表的自定义设计,然后在这个自定义的数据库中实现用户信息的认证与授权工作。 一. 核心API源码介绍 1. UserDetailsService源码 在上一章节中,我给大家介绍了一个JdbcUserDeta
832 0
配置Shiro核心过滤器与相关配置
<!--anon 表示匿名访问,不需要认证以及授权--> <!--authc表示需要认证 没有进行身份认证是不能进行访问的--> <!--roles[admin]表示角色认证,必须是拥有admin角色的用户才行--> <!--user表示用户不一定已通过认证,只要曾被Shiro记住过登录状态的用户就可以正常发起请求,比如rememberMe--> <!--perms表示指定过滤规则,这个一般是扩展使用,不会使用原生的--> <!--port表示请求的URL端口验证--> <!--ssl表示安全的URL请求,协议为https--> <!--rest表示根据请求的方法,