SpringBoot Shiro Ajax的认证处理

吐槽

真是什么都做一点,最近撸主变成了一个web后端程序员去了,真是什么都弄一点,什么都不精通,八爪章鱼

问题

springboot用shiro来做ajax动静分离的方案的认证和授权的时候遇到一个特别为难的问题,那就是你访问未授权页面的时候,登陆未成功或者未登陆访问需要认证的接口的时候,服务器端回redirect重定向到loginUrl,这对于莫版型写法的页面是很方便的,但是我们ajax更希望看到的是服务器端返回一个json,那么怎么做呢?看了一些博客讲的都不是特别明白少了这个少了那个的,我总结一下

解决

其实问题要解决很简单,你首先要明白的一点就是shiro怎么拦截你的http请求的,其实是通过一系列的filter拦截器来做到的。我们先看看shiro下面的两个packge:

org.apache.shiro.web.filter.authc
org.apache.shiro.web.filter.authcz

是不是有点熟悉,你在配置shiro的拦截规则的时候不就用到了anthc这个关键字嘛,系统就是通过anthc下面的filter来决定对你认证情况的处理,比如说放行和重定向。那么你自然知道authz是什么了吧,点进去这个链接看看:

https://shiro.apache.org/static/1.2.5/apidocs/org/apache/shiro/web/filter/authc/package-summary.html

解决方法就是继承相关的认证filter,并重写onAccessDenied接口,这个接口就是当你被shiro拒绝访问的时候的处理函数,放行的话额,我们貌似不需要处理吧,role和perm也类似

栗子 用户未登陆被拒绝访问返回json

public class TestAuthorizationFilter extends FormAuthenticationFilter {	
	protected boolean onAccessDenied(ServletRequest request, ServletResponse response) {
		if (isLoginRequest(request, response)) {
			return true;
        	}
		//这里你使用response尽情的回复吧
		return false;
	}
}

这还没完,shiro还是不知道什么时候用你这个filter,需要在ShiroFilterFactoryBean的configure里面做一个filter配置:

filtersMap.put("authc", new TestAuthorizationFilter());
shiroFilterFactoryBean.setFilters(filtersMap);

你应该知道这段代码在哪里吧,如果使用xml需要在xml里面配置

你可能感兴趣的:(java,后端)