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的分享