53-Shiro-2

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,里面如果配置了:/login.jsp = anon,意思就是这个url可以被匿名访问

    除此以外的,必须认证之后才可以访问:

    # 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来进行设置

你可能感兴趣的:(shiro)