提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
这里我说一说我最近的学习感受。在接触开源项目的时候,我已经储备了一些基础知识,知道了一些框架怎么使用。这个时候看代码,你会有很多疑问,比如执行顺序,为什么这么配置,这个时候你会不断的ctrl+b 一层一层进去看,越看你就越开始怀疑自己,我真的会了吗?我这里可能不是要叫你一定要弄到它的原理什么的,想你传递学习的负面信息。我觉得对于一个新手而言,学习框架的时候应该有清楚的认识,框架肯定是被封装过的,其次你学框架干嘛?是会用了,了解了就可以,那么一开始就没必要深入研究。
一、xmall中如何使用shiro
上面一篇我看了xmall-sso 单点登录功能,我们发现这里面的代码很简单,就是去数据库查询然后校验,生成token放到redis中。还写了一个根据token获取用户数据的方法。那么在服务调用的时候是不是每次都需要自己手动校验登录状态和权限呢?不管每个请求都自己手动写校验还是用AOP实现校验。都需要我们自己实现。一个是增加了项目的复杂度和难度,也容易出错。
我们可以看到xmall-front-web 中没有使用,但是在xmall-manager-web中用到了shiro。接下来我们来看看如何使用shiro框架来实现登录和权限校验的。
二、shiro校验
1.shiro配置
<!-- 配置自定义Realm -->
<bean id="myRealm" class="cn.exrick.manager.shiro.MyRealm"/>
<!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="myRealm"/>
</bean>
<bean id="perms" class="cn.exrick.manager.shiro.MyPermissionFilter"/>
<!-- Shiro过滤器 核心-->
<bean id="shiroFilter" class="cn.exrick.manager.shiro.MyShiroFilterFactoryBean">
<!-- Shiro的核心安全接口,这个属性是必须的 -->
<property name="securityManager" ref="securityManager"/>
<!-- 身份认证失败,则跳转到登录页面的配置 -->
<property name="loginUrl" value="/login"/>
<!-- 登录成功之后的 跳转页面 -->
<property name="successUrl" value="/"/>
<!-- 权限认证失败,则跳转到指定页面 -->
<property name="unauthorizedUrl" value="/403"/>
<!--自定义过滤器-->
<property name="filters">
<util:map>
<entry key="perms" value-ref="perms"></entry>
<entry key="roles" value-ref="perms"></entry>
</util:map>
</property>
<!-- Shiro连接约束配置,即过滤链的定义 -->
<property name="filterChainDefinitions">
<value>
<!--anon 表示不需要认证以及授权-->
<!--authc 表示需要认证 没有登录是不能进行访问的-->
<!--perms 表示需要该权限才能访问的页面 /user/* = perms[/*] -->
<!--roles 表示需要角色才能访问的页面 /* = roles[管理员]-->
<!--/login = anon
/401 = anon
/ = authc
/index = authc
/welcome = authc
/thanks-pic = authc
/lock-screen = authc
/user/logout = authc
/user/userInfo = authc-->
</value>
</property>
</bean>
<!-- Shiro生命周期处理器 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
这里可以分几个部分
配置securityManager安全管理器 他需要注入一个Realm
配置自定义的realm
配置自定义的filter MyPermissionFilter
2.登录权限校验
看下它具体的执行流程
一个url请求过来,首先被MyPermissionFilter拦截
这个类里就一个方法isAccessAllowed 这是一个什么方法呢?
ctrl+b 在AccessControlFilter中找到它是一个抽象方法并且找到了在什么地方调用的,这里我们顺带看一下onAccessDenied 这个方法它和isAccessAllowed 区别就是一个在登录时候,用一个在登录失败的时候走这个方法,一般用来重定向到401页面
在往里看在这个PathMatchingFilter里面终于找到熟悉的代码了
preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用。
看到这儿是不是发现filter(过滤器) 和Interceptor(拦截器)很像 推荐一篇文章Filter与Interceptor 区别
完事后回到controller
SecurityUtils就是
subject 也是securityManager管理的
最后subject.login(token),去调用框架登录权限校验等
总结
shiro里面的知识还有很多很多,如果当当看一两个案例是不全面的。最好还是去看官方的文档。后面我们改造项目加入JWT