Shiro入门(四)Shiro登录验证源码及策略

news/2024/7/8 6:41:43

前言

      本章讲解Shiro登录验证的源码剖析以及登录验证策略

方法

一、Shiro登陆验证源码解析

1.使用Subject的login方法验证token

2.实际上Subject类仅仅是一个接口,他通过实现类DelegatingSubject将token委托给SecurityManager 来完成验证

3.而SecurityManager作为“心脏”接口,有很多的实现类帮助干活,上面的login方法实际是通过DefaultSecurityManager调用authenticate方法完成验证

 

4. authenticate方法是由其父类AuthenticatingSecurityManager完成的

 在这里其有一个authenticator属性,这便是验证器啦:

5. Authenticator是由其默认的实现类ModularRealmAuthenticator的doAuthenticate方法来完成验证的

  

6. doAuthenticate方法用来获取realms,来将token和realm中的数据进行比较(验证),如果是单一的realm则直接进行比较。如果是多个realms则需要通过AuthenticationStrategy(验证策略)进行验证。

二、Shiro登陆验证策略

1.概述

在Shiro中一共有以下三种验证策略,用来在多realms条件下的验证。

AllSuccessfulStrategy所有都满足的情况
AtLeastOneSuccessfulStrategy至少一条满足的情况
FirstSuccessfulStrategy至少一条满足的情况,后续Realm停止验证

默认的认证策略为 AtLeastOneSuccessfulStrategy

2.编码验证

1)我们来设置两个realm(IniRealm、JdbcRealm)

配置文件做如下更改:

[main]
dataSource  = com.mchange.v2.c3p0.ComboPooledDataSource
dataSource.driverClass = oracle.jdbc.driver.OracleDriver
dataSource.jdbcUrl = jdbc:oracle:thin:@localhost:1521:orcl
dataSource.user = scott
dataSource.password = tiger
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
iniRealm = cn.edu.ccut.test.MyRealm
# $相当于spring的依赖注入
jdbcRealm.dataSource = $dataSource
authenticationStrategy = org.apache.shiro.authc.pam.AllSuccessfulStrategy
securityManager.authenticator.authenticationStrategy = $authenticationStrategy
securityManager.realms = $jdbcRealm,$iniRealm

MyRealm为我自定义的IniRealm,代码如下:

package cn.edu.ccut.test;

import org.apache.shiro.realm.text.IniRealm;

/**
 * @Auther:jwang
 * @Date:2019/5/10
 * @Description:cn.edu.ccut.test
 * @Version 1.0
 **/
public class MyRealm extends IniRealm {

    public MyRealm(){
        this.setResourcePath("classpath:user.ini");
    }
}

他使用了一个user.ini,user.ini用来配置用户名和密码:

JdbcRealm还是之前我们学习的那个,没有变化:

 

这时候我们的策略是 AllSuccessfulStrategy,也就是所有realm必须满足条件,我们输入zhangsan和1234验证通过,

sa和sa则验证失败

 

2)下面我们换一个策略 FirstSuccessfulStrategy

这时候,输入lisi和5678也可以验证成功,并不是说FirstSuccessfulStrategy是第一个Realm成功才算成功!这点尤为重要!

3)最后我们尝试默认的策略AtLeastOneSuccessfulStrategy

我们依然使用lisi和5678登录:

使用sa和sa登录:

 


http://www.niftyadmin.cn/n/2757437.html

相关文章

OCM考点之一外部表管理

一、创建外部表以及产生dmp文件1、创建directory,需要有 create any directory权限:CREATE DIRECTORY admin AS /oracle/admin; 或者创建了diretory后授权read权限:GRANT READ ON DIRECTORY admin TO scott; 2、创建外部表:SQL&…

《从零开始学Swift》学习笔记(Day 56)—— Swift编码规范之命名规范

原创文章,欢迎转载。转载请注明:关东升的博客 程序代码中到处都是自己定义的名字,取一个有样并且符合规范的名字非常重要。命名方法很多,但是比较有名的,广泛接受命名法有:匈牙利命名,一般只是命…

《流量的秘密 Google Analytics网站分析与商业实战》一1.6 有问有答:衡量成功...

本节书摘来自异步社区《流量的秘密 Google Analytics网站分析与商业实战》一书中的第1章,第1.6节,作者 【英】Brian Clifton,更多章节内容可以访问云栖社区“异步社区”公众号查看 1.6 有问有答:衡量成功 http://trends.builtwit…

《途客圈创业记:不疯魔,不成活》一一2.7 愿景和使命

本节书摘来自异步社区出版社《途客圈创业记:不疯魔,不成活》一书中的第2章,第2.7节,作者:陈天,更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.7 愿景和使命 初始的团队组建起来了,我…

从明星扎堆转型互联网 看内容草根时代的结束

在互联网时代,与其说“得屌丝者得天下”,不如说这是一个由千千万万草根支撑起来的繁华时代。作为占据互联网参与者最重要的组成部分,草根此前承担着两大重任。一是内容创造,为互联网不断输入多个领域的内容和信息;另一…

Windows Phone开发(35):使用Express Blend绘图

原文:Windows Phone开发(35):使用Express Blend绘图 上一节中我们简单扯了一下绘图指令,然而那也不是最简单的绘图法,今天,我再向大家推荐一种更好的绘图方案——Express Blend工具的使用。 这个工具是随SD…

Revit API批量布置函数doc.Create.NewFamilyInstances();

startusing ACreat Autodesk.Revit.Creation;//批量布置doc.Create.NewFamilyInstances();[Transaction(TransactionMode.Manual)][Regeneration(RegenerationOption.Manual)]public class cmd : IExternalCommand{public Result Execute(ExternalCommandData cmdData, ref st…

SVN配置,WWW同步,添加注释才能提交

1、测试安装环境#lsb_release –a#uname –a2、安装测试软件(1)安装软件# yum -y install subversion(2)测试软件是否安装成功#svnserve --version3、新建一个目录用于存储SVN所有文件#mkdir /opt/svn该目录是SVN根目录,后期可以再执行新建版本库的命令用来创建多个…