发表于: 2018-03-23 20:52:34

1 725


Shiro学习总结

今天完成的事情:

首先,在web里面配置:

这个过滤器尽量优先,因为它是最外层的一个东西

然后在spring的配置文件中加载shiro配置:

这里详细讲解一下这个核心拦截器链(亦或是过滤器?这个定义有点含糊,毕竟shiro的框架比较复杂):

securityManager:核心配置文件,可以注入很多功能,待会再讲。

loginUrl,successUrl,unauthorizedUrl等:这些url都是配合内置默认拦截器进行工作的,比如说loginUrl和successUrl配合authc,unauthorizedUrl配合prems等。在实际项目中,这些默认拦截器往往不能满足要求,需要我们自己实现不同的拦截器接口,然后注册,注入到filters这条属性里面。这里我用的是spring自动扫描的方式完成注入的:

最后一个的环节是securityManager的配置,其中实现并注册授权管理器是必要的:


然后讲一下它处理登录的一些基本功能:

首先,在登录方法中调用shiro自带的登录方法:

然后这个login()方法内的参数会传到授权管理器的实现方法中:

然后密码不对,用户名不存在,登录失败次数到一定次数(需额外配置)等情况会抛出异常,需要自定义实现MVC异常处理器完成统一处理,返回给前端不同的json。


以上是最简单的登录检验,接下来讲一讲授权管理器另外一个需要实现的接口方法:

然后通过默认或者自定义的拦截器对每次必要的访问请求(在第一张图filterChainDefinitions里面配置)进行

检验。不过,在此之前想想看,每一个页面是不是也应该对应有一个权限要求,这个怎么实现?常见的有标签法,不过需要手动配置开启这个功能:

记得最好要在SpringMVC里面配置,因为它本身是扫了controller层的


不过我没有采取这种方式,而是采取了限制、校核二合一的一个方法。如图一,我自定义实现了一个id为“filter”的拦截器(实现了AccessControlFilter):

这里要注意:

Shiro对Servlet容器的FilterChain进行了代理,即ShiroFilter在继续Servlet容器的Filter链的执行之前,通过ProxiedFilterChain对Servlet容器的FilterChain进行了代理;即先走Shiro自己的Filter体系,然后才会委托给Servlet容器的FilterChain进行Servlet容器级别的Filter链执行;Shiro的ProxiedFilterChain执行流程:1、先执行Shiro自己的Filter链;2、再执行Servlet容器的Filter链(即原始的Filter)。

所以,这里想通过抛出特定异常,然后在MVC异常拦截器中统一处理是行不通的,后端会直接报错,无法拦截异常,然后前端请求的status会变成500。所以必须通过获取PrintWriter的方式输出json数据。对象转化为json可以使用jackson或者阿里开发的fastjson:


然后自己写一个ajax请求按钮进行测试,可以在前端控制台中发现成功获取到拦截信息/结果信息。

登录之前:

控制台输出:

输出123123是因为我在filter里面拦截后方法中写了这个。

关于这个方法有很多可以实现的功能,这里不细说了。

然后登录,因为这里我硬编码了,所以账密mike直接登录就行了:

然后再测试这个限权接口:

然后在后端控制台里面可以看见:


这里有一个警告,说是没有缓存,所以我们接下来要配置缓存,这部分内容留到下一篇日报吧,这片日报长度已经达到限制了。


明天计划的事情:继续进行shiro的学习总结


遇到的问题:null


收获:总结,加深掌握


返回列表 返回列表
评论

    分享到