测试过程中,发现shiro在认证不通过时会自动跳转到login.jsp页面,然后login.jsp界面找不到,会出现404的报错,但是本项目是前后端分离的项目,不需要shiro帮我们跳转啊!
还好shiro的权限验证是基于过滤器实现的
解决如下:
1 增加过滤器 LoginFilter
/** * shiro登录过滤器 * 默认情况下 如果shiro验证失败 会进入到login.jsp的路径 但是目前不需要这么跳转 */public class LoginFilter extends UserFilter { /** * 这个方法用于处理未登录时页面重定向的逻辑 * 因此,只要进入了这个方法,就意味着登录失效了 * 我们只需要在这个方法里,给前端返回一个登录失效的状态码即可 * @param request * @param response * @throws IOException */ @Override protected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException { response.setContentType("application/json; charset=utf-8"); ObjectMapper mapper = new ObjectMapper(); // 自定义返回内容 // 本处返回一个自己定义的ResultVo对象 response.getWriter().write(mapper.writeValueAsString(new ResultVo(AppCode.ERROR,"无权访问", AppConstant.NO))); }}
2 设置ShiroConfig中创建ShiroFilterFactoryBean的Bean
需要说明一下ShiroFilterFactoryBean中Map中String的含义
authc(authentication)拦截器表示需要身份认证通过后才能访问
anon(anonymous)拦截器表示匿名访问(即不需要登录即可访问)
[urls] 部分的配置,其格式是:“url=拦截器[参数],拦截器[参数]”;
代码如下 :
//Filter工厂,设置对应的过滤条件和跳转条件@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); //过滤器 Map filters = shiroFilterFactoryBean.getFilters(); filters.put("authc", new LoginFilter()); //权限 Mapmap = new HashMap<>(); //放开一部分权限 //文档的权限 map.put("/doc.html","anon"); map.put("/swagger-resources/**", "anon"); map.put("/webjars/**", "anon"); map.put("/v2/api-docs", "anon"); map.put("/swagger-ui.html", "anon"); //登录/注销的权限 map.put("/employee/login", "anon"); map.put("/employee/logout", "anon"); //登出 // map.put("/logout", "logout"); //对所有用户认证 map.put("/**", "authc"); //登录 //shiroFilterFactoryBean.setLoginUrl("/login"); //首页 //shiroFilterFactoryBean.setSuccessUrl("/index"); //错误页面,认证不通过跳转 //shiroFilterFactoryBean.setUnauthorizedUrl("/error"); shiroFilterFactoryBean.setFilterChainDefinitionMap(map); return shiroFilterFactoryBean;}