一种基于Redis存储的Shiro验证方法与流程

文档序号:12182722阅读:388来源:国知局
一种基于Redis存储的Shiro验证方法与流程

本发明涉及计算机技术领域,特别地涉及一种基于Redis存储的Shiro验证方法。



背景技术:

随着电子商务、社交网络、微博等一系列新型互联网产品的诞生,基于Web环境的互联网应用越来越广泛。企业信息化的过程中各种应用都架设在Web平台上,Web业务的迅速发展也引起黑客们的强烈关注,接踵而至的就是Web安全威胁的凸显。黑客利用网站操作系统的漏洞和Web服务程序的SQL注入漏洞等方式,得到Web服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,更为严重的则是在网页中植入恶意代码,使得网站访问者受到侵害。对于开发人员来说急需一个权威的安全框架,来进行简单安全的功能开发。

ApacheShiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。对于任何一个应用程序,Shiro都可以提供全面的安全管理服务。并且相对于其他安全框架,Shiro要简单的多。

Shiro的三个核心组件分别是Subject、SecurityManager和Realm。Subject是一个抽象概念,代表了当前操作用户,可以是人,也可以是第三方进程、后台帐户或其他类似事物。SecurityManager是一个安全管理器,管理所有与安全有关的操作,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。从这个意义上讲,Realm实质 上是一个安全相关的数据访问对象:它封装了数据源的连接细节,并在需要时将相关数据如用户、角色、权限等提供给Shiro。当配置Shiro时,必须至少指定一个Realm,用于认证和(或)授权。

也就是说,最简单的一个Shiro应用:

1、应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager;

2、我们需要给Shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断。

Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如轻量目录访问协议(LDAP)目录、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。其中,针对大量、复杂数据的存储,Shiro框架支持两种Realm存储方式进行安全验证,一种是基于关系数据库的存储方式的安全验证(如图1所示,为Shiro框架基于关系数据库的Realm存储的安全验证流程图),另一种是基于EhCache(一个纯Java的进程内缓存框架)的存储方式的安全验证。

以图1为例,对数据库中按照Shiro的验证规则存储的大量数据信息进行验证,开始(步骤S11)后,用户输入系统登录所需的信息;之后,根据用户输入的登录信息生成用户对象(步骤S12);根据生成的用户对象从数据库中获取对应的Realm对象(步骤S13);在进行Realm对象获取时,首先,判断该Realm对象是否存在(步骤S14);如果存在,通过Shiro框架的SecurityManager进行验证(步骤S15),以判断输入的登录信息是否正确,否则结束。同样地,基于EhCache的存储方式的安全验证与此类似,区别仅是Realm对象存储的位置不同,相应的步骤S13中为从EhCache中获取对应的Realm对象。

然而,在使用过程中发现,现有的技术方案仅能支持对在关系型数据库和EhCache中存储的数据进行安全验证,存在着明显的缺陷和 不足。

1、基于关系数据库存储的安全验证:

常用的关系数据库如Oracle和MySQL等,都存在存取速度慢、数据结构单一、并发能力低和集群难度大等缺点。基于关系数据库的数据存储及读取,不仅需要在数据库中增加大量的数据库表,同时在存储及读取过程中响应速度慢,造成服务整体性能下降。在高并发系统中,大量而频繁的访问数据库,将导致数据库死锁,从而造成系统崩溃。

2、基于EhCache存储的安全验证:

EhCache是一个纯Java的进程内缓存框架,它是基于JVM(Java Virtual Machine,Java虚拟机)内存进行数据存储的。JVM内存空间很小,需要对过大过多的对象进行缓存时,将会造成内存溢出,导致服务不可用。

综上,数据库已成为大型网站性能瓶颈的重要因素,很多互联网公司已经大量使用缓存技术,来减小数据库的访问压力;EhCache由于内存空间大小的限制,很多场景都不可用。因此,亟需一种新的Realm存储方式,来解决以上的问题。



技术实现要素:

有鉴于此,本发明提供一种基于Redis存储的Shiro验证方法,基于Redis缓存技术进行数据存储,存储方式更为灵活,通过将会话放置于Redis中缓存,能够减少内存消耗,以解决内存溢出的问题;引入过期时间算法来自动清除缓存,提高了缓存的效率和命中率,从而保证数据高效、可靠的进行存储。

为实现上述目的,本发明提供了一种基于Redis存储的Shiro验证方法。

本发明的一种基于Redis存储的Shiro验证方法包括:根据用户的登录参数,将用户的标识信息进行封装,生成唯一标识;根据所述唯一标识,查找Redis服务器中是否有对应的缓存;如果有所述对应的缓存,则获取所述唯一标识的登录信息,并封装登录成功信息;如果没有所述对应的缓存,则调用登录验证方法及权限验证方法进行验证,若验证通过,封装登录成功信息,若验证失败,提示登录验证失败。

可选地,所述用户的标识信息包括:用户的用户名、域名及根据预定规则生成的特定标识。

可选地,获取所述唯一标识的登录信息之后,还包括:更新所述唯一标识的过期时间。

可选地,更新所述唯一标识的过期时间包括:通过调用过期时间算法进行计算,得到所述唯一标识的过期时间并进行更新。

可选地,所述过期时间算法包括:判断两次登录验证期间是否有访问次数;如果有访问次数,则判断所述访问次数是否超过最大访问次数;如果所述访问次数超过最大访问次数,则取最大过期时间作为过期时间;否则,获取过期时间增量值,并根据所述过期时间增量值、访问次数及默认过期时间计算过期时间;如果没有访问次数,则将默认过期时间作为所述过期时间。

可选地,所述登录验证方法包括:根据所述唯一标识从Redis中获取正确的用户名并验证用户输入的用户名是否合法;如果用户输入的用户名合法,则根据所述唯一标识从Redis中获取正确的密码并验证用户输入的密码是否合法;如果用户输入的密码合法,提示登录验证成功;否则,提示登录验证失败;如果用户输入的用户名不合法,则提示用户输入的用户名错误。

可选地,所述权限验证方法包括:根据所述唯一标识从Redis中获取对应的角色信息并进行角色授权;根据所述唯一标识从Redis中获取对应的权限信息并进行权限授权。

根据本发明的技术方案,通过将用户名封装为唯一标识,可以方便从Redis服务器中进行数据的存取操作;将会话放置于Redis中缓存,既减少了内存消耗,解决了内存溢出的问题,同时在对登录信息进行验证时,若Redis服务器的缓存中存在该唯一标识,则无需调用登录验证方法及权限验证方法进行验证,可使验证过程简化,从而提高了验证效率;通过引入过期时间算法来自动清除缓存,解决了手动清除缓存数据带来的冗余和数据偏差,从而提高了缓存的效率和命中率,保证了数据高效、可靠地进行存储。

附图说明

附图用于更好地理解本发明,不构成对本发明的不当限定。其中:

图1是现有技术中Shiro框架基于关系数据库的Realm存储的安全验证流程图;

图2是根据本发明实施例的一种基于Redis存储的Shiro验证方法的主要步骤示意图;

图3是根据本发明实施方式的Shiro验证流程图;

图4是根据本发明实施方式的登录验证方法的实现流程图;

图5是根据本发明实施方式的权限验证方法的实现流程图;

图6是根据本发明实施方式的过期时间算法的实现流程图;

图7是根据本发明实施方式的获取缓存方法的实现流程图。

具体实施方式

以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做 出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。

本发明是对Shiro框架进行的二次开发,通过对Shiro框架提供的应用程序编程接口中的一些核心类进行改装,使得Shiro框架支持对Redis进行Realm存储。

图2是根据本发明实施例的一种基于Redis存储的Shiro验证方法的主要步骤示意图。如图2所示,本发明的一种基于Redis存储的Shiro验证方法主要包括如下的步骤S21至S24。

步骤S21:根据用户的登录参数,将用户的标识信息进行封装,生成唯一标识。其中,用户的标识信息可以包括用户的用户名、域名及根据预定规则生成的特定标识等。本发明中的特定标识的值是一个定值字符串(例如:"login"),且该值不会发生变化。当用户进行登录操作时,即可获得用户名、用户的域名等信息。在对用户的标识信息进行封装时,可根据需要选取不同的方法,例如,可选用哈希算法对用户的标识信息进行运算,以生成固定长度的字符串,作为唯一标识等。通过对用户名及相关信息进行封装,使得用户名等标识信息成为唯一标识,以便后续从Redis服务器中进行数据的存取操作。

步骤S22:根据所述唯一标识,查找Redis服务器中是否有对应的缓存。在Redis中,数据是以Key-Value的形式进行保存的,以唯一标识作为Key进行检索,即可得到相应的其他信息。通过对CachingSessionDAO类进行改造,将唯一标识Key的会话信息放置于Redis中进行缓存,可以对会话进行统一的跨服务器管理,实现同一用户多服务器统一权限管理。同时,避免了会话存储在cookie中带来的安全问题。

步骤S23:如果有对应的缓存,则获取所述唯一标识的登录信息, 并封装登录成功信息。查找到唯一标识所对应的缓存信息后,从中获取登录信息,例如:登录时间、登陆次数及登录成功时显示的问候语等,并将该登录信息进行转换成可识别的字符显示给用户,之后,将本次登录成功的信息进行封装,验证结束。

其中,在获取到登录信息后,还可以更新该唯一标识的过期时间。通过调用过期时间算法进行计算,得到所述唯一标识的过期时间并进行更新。过期时间算法,主要包括下面的步骤:首先判断两次登录验证期间是否有访问次数。如果有访问次数,则判断所述访问次数是否超过最大访问次数;如果所述访问次数超过最大访问次数,则取最大过期时间作为过期时间;否则,获取过期时间增量值,并根据所述过期时间增量值、访问次数及默认过期时间计算过期时间,此处过期时间=默认过期时间+过期时间增量值*访问次数。如果没有访问次数,则将默认过期时间作为过期时间。

通过引入过期时间,可以设置数据缓存的时间,到期自动清除缓存数据,解决了手动清除缓存数据带来的冗余和数据偏差,从而提高了缓存的效率和正确性,进而提高了缓存的命中率。

步骤S24:如果没有所述对应的缓存,则调用登录验证方法及权限验证方法进行验证,若验证成功,封装登录成功信息,若验证失败,提示登录验证失败。其中,所述登录验证方法,包括:根据所述唯一标识从Redis中获取正确的用户名并验证用户输入的用户名是否合法;如果用户输入的用户名合法,则根据所述唯一标识从Redis中获取正确的密码并验证用户输入的密码是否合法;如果用户输入的密码合法,提示登录验证成功;否则,提示登录验证失败;以及如果用户输入的用户名不合法,则提示用户输入的用户名错误。

由步骤S21至步骤S24可以看出,通过将用户名封装为唯一标识,可以方便从Redis服务器中进行数据的存取操作;将会话放置于Redis 中缓存,既减少了内存消耗,解决了内存溢出的问题,同时在对登录信息进行验证时,若Redis服务器的缓存中存在该唯一标识,则无需调用登录验证方法及权限验证方法进行验证,可使验证过程简化,从而提高了验证效率;通过引入过期时间算法来自动清除缓存,解决了手动清除缓存数据带来的冗余和数据偏差,从而提高了缓存的效率和命中率,保证了数据高效、可靠地进行存储。

图3是根据本发明实施方式的Shiro验证流程图;图4是根据本发明实施方式的登录验证方法的实现流程图;图5是根据本发明实施方式的权限验证方法的实现流程图;图6是根据本发明实施方式的过期时间算法的实现流程图;图7是根据本发明实施方式的获取缓存的方法的实现流程图。以下将结合这些附图对本发明的实施过程进行详细的介绍。

Shiro框架的Subject类提供的login方法是登录验证的入口,此方法会传递用户的登录参数信息,如用户名和密码等。如图3所示,用户输入登录参数(步骤S31),例如:用户名(可以是手机号、邮箱或者自定义名称)和密码后,login方法将用户名、域名及特定标识(值为一个定值字符串,例如:"login",该值不会发生变化),进行唯一标识封装(步骤S32),以便后续从Redis服务器中进行数据的存取操作。之后,开始验证(步骤S33)。以唯一标识为查询关键字,从Redis中查找是否有缓存(步骤S34),如果有缓存数据,则获取缓存中的登录信息(步骤S36),并封装登录成功信息(步骤S37),否则,调用登录验证方法及权限验证方法进行验证(步骤S35),如果验证成功,执行步骤S37,否则,提示验证失败。特殊情况下,在访问某些比较关键的页面内容时,即使已封装登录成功信息,也会要求对登录信息进行验证,此时,会再次从步骤S33开始执行。

图4是如图3中所示的步骤S35中的登录验证方法的具体流程。Shiro框架的AuthorizingRealm类提供的登录验证的方法是 doGetAuthenticationInfo方法,系统的登录业务都将在该方法中完成。如图4,当用户输入登录参数(用户名、密码)(步骤S41)后,login方法会封装好唯一标识,登录验证方法根据唯一标识从Redis中获取正确的用户名(步骤S42),并与用户输入的用户名比较,以判断输入的用户名是否合法(步骤S43),如果不合法,则登录验证失败(步骤S47);否则,继续验证,根据唯一标识从Redis中获取正确的密码(步骤S44),并比较判断输入的密码是否合法(步骤S45),如果合法,登录验证成功(步骤S46),否则登录验证失败(步骤S47)。

图5是如图3中所示的步骤S35中的权限验证方法的具体流程。Shiro框架的AuthorizingRealm类提供的权限验证的方法是doGetAuthorizationInfo方法,是在登录验证完成之后,对用户的权限进行验证和授权。如图5,登录验证成功后,获取合法参数(用户名、密码)(步骤S51),也就是之前输入的登录参数,之后,根据唯一标识从Redis中获取角色信息(步骤S52),并进行角色授权(步骤S53)。然后,根据唯一标识从Redis中获取权限信息(步骤S54),并进行权限授权(步骤S55),对用户的权限验证和授权完成后,用户登录成功,封装登录成功信息。

图7是如图3中所示的步骤S36中获取缓存中的登录信息的详细步骤。在本发明的实施例中,引入过期时间算法对CacheManager类的getcache方法进行改造,采用对键名Key进行过期时间管理的方式,解决手动清除缓存数据带来的冗余和数据偏差,提高缓存的命中率和缓存效率。如图7所述的流程图,首先是判断缓存中,键名Key是否存在(步骤S71),此处的键名Key指的是唯一标识,如果不存在,则结束操作,否则,根据键名Key从Redis中获取数据(步骤S72),此处的数据指的是需要用到的信息,例如:登录成功标识符、用户名、过期时间等,之后,通过调用过期时间算法(步骤S73)计算得到过期时间,并更新键名Key的过期时间(步骤S74)。之后,进行数据转换(步骤S75),将步骤S72中获取的数据转换为可显示给用户的信息。

图6是本发明的过期时间算法流程。首先,判断在两次登录验证期间是否有访问次数(步骤S61),如果没有,则获取默认过期时间(步骤S62)作为过期时间以更新过期时间(步骤S67);如果有,则继续判断两次登录验证期间的访问次数是否超过最大访问次数(步骤S63),如果超过,则获取最大过期时间(步骤S64)作为过期时间以更新过期时间(步骤S67);否则获取过期时间增量值(步骤S65),并计算过期时间(步骤S66),过期时间=默认过期时间+过期增量值*访问次数。本算法中出现的默认过期时间、最大访问次数、最大过期时间、过期时间增量值均可以根据系统功能的要求进行预先设定。例如,假设根据需要设置默认过期时间为30分钟,最大访问次数为50次,最大过期时间为3个小时,过期时间增量值为2分钟,在两次登录验证期间有5次访问,则相应的过期时间=30+2*5=40分钟;如果两次登录验证期间有51次访问,已超过最大访问次数,则取最大过期时间作为过期时间,此时,过期时间变成3个小时。

根据本发明实施例的技术方案,通过将用户名封装为唯一标识,可以方便从Redis服务器中进行数据的存取操作;将会话放置于Redis中缓存,既减少了内存消耗,解决了内存溢出的问题,同时在对登录信息进行验证时,若Redis服务器的缓存中存在该唯一标识,则无需调用登录验证方法及权限验证方法进行验证,可使验证过程简化,从而提高了验证效率;通过引入过期时间算法来自动清除缓存,解决了手动清除缓存数据带来的冗余和数据偏差,从而提高了缓存的效率和命中率,保证了数据高效、可靠地进行存储。

上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1