sass ihrm项目-zuul网关

1快速入门(工程搭建、编写启动类、编写配置文件、配置路由规则、添加Eureka客户端发现功能、修改配置文件)
在这里插入图片描述
2ZuulFilter
ZuulFilter是过滤器的顶级父类。在这里我们看一下其中定义的4个最重要的方法

public abstract ZuulFilter implements IZuulFilter{
abstract public String filterType();
abstract public int filterOrder();
boolean shouldFilter();// 来自IZuulFilter
Object run() throws ZuulException;// IZuulFilter
}

3 自定义过滤器

@Override
public String filterType() {
// 前置过滤器
return "pre";
}
@Override
public int filterOrder() {
//优先级为0,数字越大,优先级越低
return 0;
}
@Override
public boolean shouldFilter() {
// 是否执行该过滤器,此处为true,说明需要过滤
return true;
}
//过滤器执行的具体逻辑
@Override
public Object run() throws ZuulException {
System.out.println("zuul过滤器...");
return null;
}

4过滤器执行生命周期
在这里插入图片描述
5基于JWT的统一鉴权
在某些应用中,往往使用JWT的形式进行无状态的用户鉴权。对于JWT的鉴权,只需要使用Zuul的自定义过滤器,在过滤器中判断是否携带JWT的token信息即可

/**
 * 自定义过滤器
 */
//@Component
public class LoginFilter extends ZuulFilter {

	/**
	 * String类型的返回值
	 *  定义过滤器类型的
	 *      pre     : 在执行路由请求之前执行
	 *      routing : 在路由请求是调用
	 *      post    : 在routing和error过滤器之后执行
	 *      error   : 处理请求出现异常的时候执行
	 */
	public String filterType() {
		return "pre";
	}

	/**
	 * int类型的返回值
	 *  定义过滤器的优先级 : 数字越小,优先级越高
	 */
	public int filterOrder() {
		return 2;
	}

	/**
	 * boolean类型的返回值
	 *  判断过滤器是否需要执行
	 *
	 */
	public boolean shouldFilter() {
		//对某些请求过滤(不执行过滤器)
		return true;
	}

	/**
	 * run方法 : 过滤器中负责的具体业务逻辑
	 *  使用过滤器进行jwt的鉴权
	 */
	public Object run() throws ZuulException {
		//System.out.println("执行了LoginFilter的run方法");

		//1.获取请求对象request
		//1.1 获取Zuul提供的请求上下文的对象(工具类)
		RequestContext rc = RequestContext.getCurrentContext();
		//1.2 从上下文对象获取request对象
		HttpServletRequest request = rc.getRequest();
		//2.从request中获取Authorization的头信息
		String token = request.getHeader("Authorization");
		//3.判断
		if(token == null || "".equals(token)) {
			//没有传递token信息,需要登录,拦截
			rc.setSendZuulResponse(false);
			//返回错误的401状态码
			rc.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
		}
		return null;
	}

}

6基于Shiro的统一鉴权
由于我们的系统使用shiro结合自定义session的形式,相当于将用户数据存储到了分布式缓存redis中。那么只需要再zuul中使用shiro即可完成统一用户权限校验

@Configuration
public class ShiroConfiguration {

    //1.创建realm
    @Bean
    public IhrmRealm getRealm() {
        return new IhrmRealm();
    }

    //2.创建安全管理器
    @Bean
    public SecurityManager getSecurityManager(IhrmRealm realm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm);
        //将自定义的会话管理器注册到安全管理器中
        securityManager.setSessionManager(sessionManager());
        //将自定义的redis缓存管理器注册到安全管理器中
        securityManager.setCacheManager(cacheManager());
        return securityManager;
    }

    //3.配置shiro的过滤器工厂

    /**
     * 再web程序中,shiro进行权限控制全部是通过一组过滤器集合进行控制
     *
     */
    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
        //1.创建过滤器工厂
        ShiroFilterFactoryBean filterFactory = new ShiroFilterFactoryBean();
        //2.设置安全管理器
        filterFactory.setSecurityManager(securityManager);
        //3.通用配置(跳转登录页面,未授权跳转的页面)
        filterFactory.setLoginUrl("/autherror?code=1");//跳转url地址
        filterFactory.setUnauthorizedUrl("/autherror?code=2");//未授权的url
        //4.设置过滤器集合
        Map<String,String> filterMap = new LinkedHashMap<>();
        //anon -- 匿名访问
        filterMap.put("/sys/login","anon");
        filterMap.put("/autherror","anon");
        //注册
        //authc -- 认证之后访问(登录)
        filterMap.put("/**","authc");
        //perms -- 具有某中权限 (使用注解配置授权)
        filterFactory.setFilterChainDefinitionMap(filterMap);

        return filterFactory;
    }


    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private int port;

    /**
     * 1.redis的控制器,操作redis
     */
    public RedisManager redisManager() {
        RedisManager redisManager = new RedisManager();
        redisManager.setHost(host);
        redisManager.setPort(port);
        return redisManager;
    }

    /**
     * 2.sessionDao
     */
    public RedisSessionDAO redisSessionDAO() {
        RedisSessionDAO sessionDAO = new RedisSessionDAO();
        sessionDAO.setRedisManager(redisManager());
        return sessionDAO;
    }

    /**
     * 3.会话管理器
     */
    public DefaultWebSessionManager sessionManager() {
        CustomSessionManager sessionManager = new CustomSessionManager();
        //sessionManager.setSessionIdCookieEnabled(false);
        sessionManager.setSessionIdUrlRewritingEnabled(false);
        sessionManager.setSessionDAO(redisSessionDAO());
        return sessionManager;
    }

    /**
     * 4.缓存管理器
     */
    public RedisCacheManager cacheManager() {
        RedisCacheManager redisCacheManager = new RedisCacheManager();
        redisCacheManager.setRedisManager(redisManager());
        return redisCacheManager;
    }


    //开启对shior注解的支持
    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
        advisor.setSecurityManager(securityManager);
        return advisor;
    }
}

链接:https://pan.baidu.com/s/1x7L7kQS8qjn_kudxvKtlJQ
提取码:wzye
–来自百度网盘超级会员V3的分享

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值