1.shiro集成spring
第三方的集成在spring肯定是需要写xml文件的,这里毋庸置疑,之后关于springboot继承shiro等,说不定完全不一样。。
2.配置shiro的filter
在web.xml里面配置shiro的filter
同样,两个,filter及其映射filter-mapping
注意:前后端分离的项目,不要写啥filter了,shiro主要拿来处理校验
3.在applicationContext里面配置shiro
①核心组件:securityManager-->
1.cacheManager:缓存管理器
这里注意了,这里只是一个ref,真正的cacheManager还是要单独写标签配置,这里可以用第三方的ehcacheManager,这里就是用的就是跟redis功能一样的本地缓存ehcache,在配置ehcache的时候,又要另外引入一个xml配置,ehcache.xml
②sessionMode-->session的一个管理方式(暂时先不看这个)
③realm:也是很重要的,配置realm,这里也是一个ref,下面会单独配置realm:注意,这里的realm是shiro里面的安全核心,相当于一个跟专门的安全DAO
这里直接自己写了一个java的realm,继承了shiro的realm接口
④这里是跟spring相关的 叫做生命周期beanPOST管理器,LifecycleBeanPostProcessor:自动的调用配置在springIOC容器里面的shiro的bean的生命周期的方法;
⑤DefaultAdvisorAutoProxyCreator & AuthorizationAttirbuteSourceAdvisor,这两个配置完了且配置了LifecycleBeanPostProcessor,就可以使用shiro注解了
⑥配置shiroFilter(关键步骤)
shiroFilter的bean的id必须要和web.xml里面的配置了DelegatingFilterProxy的
1.把securityManager给ref进来
2.这里要配置一个loginUrl,就是没有登陆,需要跳转到登陆的页面,如果用vue的话,那么这里没必要写啊,还是由前端控制
3.successUrl,同样,登陆成功后的页面,还是要前端来写
4.同理的还有unauthorizedUrl,没有该授权的跳转到哪个页面
5.配置哪些页面需要受保护,以及访问这些页面需要的权限
这里有一个属性值配置:filterChainDefinitions,里面如果配置了:
除此以外的,必须认证之后才可以访问:
# everything else requires authenticcation:
/** = autchc
照理来说,这不是前端的事???。。。
tips:等于说,现在shiro的权限分配管理,也就是filter这一块,全部由前端管理了,shiro只需要负责token这一块,以及realm一小块
4.shiro认证(从前端不管是post,还是表单,拿到账号密码,肯定要用realm在后台从数据库拿密码进行比对)
流程:
①前端传来一个form表单
②获取当前的Subject,判断是否已经授权
③没有授权,那么就把username和pwd封装成token,然后用这个token登录
④登录的过程,自定义realm,拿账号去数据库查,查完以后密码比对
5.realm的使用
①用Subject传了一个token,这个token传到哪儿了呢,直接就传到了realm里面,也就是你的extends或者implementts了realm相关的实现类的方法里面了
②从realm方法里面拿到了AuthenticationInfo以后,接下来要强转成UsernamePasswordToken
③进行DAO操作,比如:查不到、用户账号锁定、冻结等,相应的抛出异常
④在进行完操作以后,这里要返回的是AuthenticationInfo的一个实现类:SimpleAuthenticationInfo
6.从数据库返回的数据
紧接着上面,如果要返回SimpleAuthenticationInfo,3个参数:
principal-->认证的实体信息,可以是username,也可以是数据表对应的用户的实体类对象 -->Object principal = username;
credentials-->从数据表中获取的密码 -->Object credentials = "123456"
realmName-->当前realm对象的name,直接调用父类的getName()方法即可 -->String realmName = getName();
上面封装的这个SimpleAuthenticationInfo,是数据库的data,而UsernamePasswordToken里面是前端传过来的data
当你的token传到realm里面,返回SimpleAuthenticationInfo以后,就是自动进行密码比对了
7.登出
登出明显还是要前端登出,后台返回命令的方式,现在的大部分教学视频还是前后端一起讲的
8.加密
从前端获取的密码,通过MD5_saulty加密以后再保存在数据库,而不要用明文
到时候进行密码比对的时候,再从数据库里面拿出来的也是MD5的加密以后的密码,如果是这样,那么用户的密码会很安全的保存在数据库,哪怕泄漏了也无法知道用户密码
9.credentialsMatcher/HashedCredentialsMatcher
这个时候在applicationContext里面找到realm这个bean
然后给这个bean加一个credentialsMatcher的property
在这里面加HashedCredentialsMatcher的bean,然后再加一个value="MD5"的算法名
然后可以给这个算法进行一些配置:
比如加密次数:写一个name="hashIterations" value=""表明你加密次数
10.加盐
在这里,SimpleAuthenticationInfo(pricipal,credentials,credentialsSalt,realmName);
在这里生产Info的时候构造参数相比上面多了一个credentialsSalt参数
这里就是要写盐值
盐值类型为:ByteSource
ByteSource credentialsSalt = ByteSrouce.Util.bytes("")
一般盐的原始值一般是username
11.多realm认证策略
在这里增加realm,还是在applicationContext里面继续添加一个realm的bean
当天添加了多个realm以后,这里在applicationContext要多加一个认证器:ModularRealmAuthenticator
在里面添加属性为reamls的属性,然后这是一个集合,把所有的realms写到里面来,这里用了list,所以这里的realm是有先后顺序的
然后把之前在security里面配置的realm去掉,加上这个Authenticator
12.realm认证策略
主要有3个:
FirstSuccessfulStrategy
AtLeastOneSuccessfulStrategy
AllSuccessfulStrategy
认证策略在applicationContext的Authenticator里面加一个属性:authenticationStrategy来进行设置