Shiro安全框架:数据库更新注意事项 (shiro更新数据库)

Shiro是一个优秀的Java安全框架,通过Shiro的使用可以简化Java应用程序的安全开发,加快应用程序的开发速度。然而,在使用Shiro时需要注意数据库的更新问题,否则会出现一些意想不到的问题。本文将详细介绍Shiro安全框架数据库更新的注意事项。

一、 对Shiro权限管理表的更新

在使用Shiro时,需要创建Shiro权限管理表,例如:user、role、permission等表。这些表记录了用户、角色、权限等相关信息。当对Shiro权限管理表进行更新时,需要注意以下几个问题。

1. 迁移数据

当需要更新Shiro权限管理表结构时,需要先迁移旧数据到新表结构中,否则会导致数据丢失,用户、角色、权限等信息都无法被正确处理。因此,必须在不影响原有应用程序的情况下,将旧数据移动到新的数据表中。

2. 检测表关联关系

在更新Shiro权限管理表结构时,需要关注表之间的关联关系,否则会出现关联数据不匹配的情况。例如,如果在更新Shiro角色表时,没有考虑到该表和其他表之间的关联关系,则会导致角色关联的用户数据出现问题。

3. 更新表结构

在更新Shiro权限管理表结构时,需要小心修改表结构,避免出现不兼容的问题。例如,如果删除了某个字段,而该字段在应用程序中被引用,则会导致应用程序无法正常工作。

二、Shiro缓存更新

Shiro安全框架以缓存来提高性能,缓存分为权限缓存和会话缓存。Shiro权限缓存基于用户、角色和权限信息,缓存这些信息提高Shiro性能。Shiro会话缓存则是缓存Shiro会话,会话缓存可以显著提高应用程序性能。当需要更新缓存时,需要注意以下几个问题。

1. 更新频率

在更新缓存时,需要注意更新频率的问题,过于频繁的缓存更新会导致性能下降,因此需要根据实际情况,选择合适的缓存更新频率。

2. 缓存清除

在缓存更新过程中,需要清除缓存中旧的数据,否则会导致数据混乱。例如,当用户密码被更新时,需要清除缓存中该用户的旧密码数据,否则用户登录时会出现认证失败的问题。

3. 缓存更新机制

在更新缓存时需要考虑缓存更新机制,例如,当Shiro权限缓存更新时,需要考虑权限缓存数据的同步。即,当用户、角色或权限表发生变更时,需要清除旧的权限缓存,并重新缓存新的权限数据。

三、Shiro密码加密算法更新

在使用Shiro时,需要对密码进行加密。Shiro提供了多种密码加密算法,如MD5和SHA-1等。当需要修改密码加密算法时,需要注意以下几个问题。

1. 算法兼容性

在修改密码加密算法时需要注意算法的兼容性问题,如果在应用程序中采用了新的密码加密算法,而Shiro权限管理表中保存的密码使用的是旧的密码加密算法,则会导致密码无法匹配,用户无法认证。

2. 数据库升级脚本

在修改密码加密算法后,需要将权限管理表中旧的密码数据转换为新的密码加密算法。因此,在密码加密算法更新时,需要同时更新数据库升级脚本,以便实现旧密码数据的转换。

四、结论

Shiro安全框架是一个极具扩展性的Java安全框架,但是在使用Shiro时,需要特别注意数据库更新问题,避免出现数据丢失和应用程序无法正常工作的问题。因此,在更新Shiro数据库时,需要认真对待,并充分测试,以确保Shiro安全框架正常运行。

相关问题拓展阅读:

  • java框架有哪些常用框架
  • Shiro的 rememberMe 功能使用指导为什么rememberMe设置了没作用

java框架有哪些常用框架

十大常用框架:

一、SpringMVC

二、Spring

三、Mybatis

四、Dubbo

五、Maven

六、RabbitMQ

七、Log4j

八、Ehcache

九、Redis

十、Shiro

延展阅读:

一、SpringMVC

SpringWebMVC是一种基于Java的实现了WebMVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringWebMVC也是要简化我们日常Web开发的。

模型(Model)封装了应用程序的数据和一般他们会组成的POJO。

视图(View)是负责呈现模型数据和一般它生成的HTML输出,客户端的浏览器能够解释。

控制器(Controller)负责处理用户的请求,并建立适当的模型,并把它传递给视图渲染。

Spring的web模型-视图-控制器(MVC)框架是围绕着处理所有的HTTP请求和响应的的设计。

SpringWebMVC处理请求的流程

具体执行步骤如下:

1、首先用户发送请求————>前端控制器,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;图2-1中的1、2步骤;

2、页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在SpringWebMVC中叫命令对象,并进行验证,然后将命令对象委托给业务对塌宽知象进行处理;处理完毕后返回一个(模型数据和逻辑视图名);图2-1中的3、4、5步骤;

3、前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;图2-1中的步骤6、7;

4、前端控制器再次收回控制权,将响应返回给用户,图2-1中的步骤8;至此整个结束。

二、Spring

2.1、IOC容器:wwwblogs/linjiqin/archive/2023/11/04/.html

IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化、定位、巧和配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中new相关的对象,应用程序由IOC容器进行组装。在Spring中BeanFactory是IOC容器的实际代表者。

2.2、AOP:blog.csdn.net/moreevan/article/details/

简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性团消和可维护性。AOP代表的是一个横向的关系

AOP用来封装横切关注点,具体可以在下面的场景中使用:

权限

Caching缓存

Contextpassing内容传递

Errorhandling错误处理

Lazyloading懒加载

Debugging调试

logging,tracing,profilingandmonitoring记录跟踪优化校准

Performance性能优化

Persistence持久化

Resourcepooling资源池

同步

事务

三、Mybatis

MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(PlainOldJavaObjects,普通的Java对象)映射成数据库中的记录。

总体流程:

(1)加载配置并初始化

触发条件:加载配置文件

将SQL的配置信息加载成为一个个对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。

(2)接收调用请求

触发条件:调用Mybatis提供的API

传入参数:为SQL的ID和传入参数对象

处理过程:将请求传递给下层的请求处理层进行处理。

(3)处理操作请求触发条件:API接口层传递请求过来

传入参数:为SQL的ID和传入参数对象

处理过程:

(A)根据SQL的ID查找对应的对象。

(B)根据传入参数对象解析对象,得到最终要执行的SQL和执行传入参数。

(C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。

(D)根据对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。

(E)释放连接资源。

(4)返回处理结果将最终的处理结果返回。

MyBatis最强大的特性之一就是它的动态语句功能。如果您以前有使用JDBC或者类似框架的经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。

四、Dubbo

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC(远程过程调用协议)远程服务调用方案,以及SOA服务治理方案。简单的说,bbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有bbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架。

1、透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。

2、软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。

3、服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

节点角色说明:

Provider:暴露服务的服务提供方。

Consumer:调用远程服务的服务消费方。

Registry:服务注册与发现的注册中心。

Monitor:统计服务的调用次调和调用时间的监控中心。

Container:服务运行容器。

五、Maven

Maven这个个项目管理和构建自动化工具,越来越多的开发人员使用它来管理项目中的jar包。但是对于我们程序员来说,我们最关心的是它的项目构建功能。

六、RabbitMQ

消息队列一般是在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。

RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。

Erlang是一门动态类型的函数式编程语言。对应到Erlang里,每个Actor对应着一个Erlang进程,进程之间通过消息传递进行通信。相比共享内存,进程间通过消息传递来通信带来的直接好处就是消除了直接的锁开销(不考虑Erlang虚拟机底层实现中的锁应用)。

AMQP(AdvancedMessageQueueProtocol)定义了一种消息系统规范。这个规范描述了在一个分布式的系统中各个子系统如何通过消息交互。

七、Log4j

日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。

八、Ehcache

EhCache是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,JavaEE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAPapi等特点。

优点:

1、快速

2、简单

3、多种缓存策略

4、缓存数据有两级:内存和磁盘,因此无需担心容量问题

5、缓存数据会在虚拟机重启的过程中写入磁盘

6、可以通过RMI、可插入API等方式进行分布式缓存

7、具有缓存和缓存管理器的侦听接口

8、支持多缓存管理器实例,以及一个实例的多个缓存区域

9、提供Hibernate的缓存实现

缺点:

1、使用磁盘Cache的时候非常占用磁盘空间:这是因为DiskCache的算法简单,该算法简单也导致Cache的效率非常高。它只是对元素直接追加存储。因此搜索元素的时候非常的快。如果使用DiskCache的,在很频繁的应用中,很快磁盘会满。

2、不能保证数据的安全:当突然kill掉java的时候,可能会产生冲突,EhCache的解决方法是如果文件冲突了,则重建cache。这对于Cache数据需要保存的时候可能不利。当然,Cache只是简单的加速,而不能保证数据的安全。如果想保证数据的存储安全,可以使用BekeleyDBJavaEdition版本。这是个嵌入式数据库。可以确保存储安全和空间的利用率。

九、Redis

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set()、zset(sortedset_有序)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis数据库完全在内存中,使用磁盘仅用于持久性。相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。Redis可以将数据复制到任意数量的从服务器。

1.2、Redis优点:

(1)异常快速:Redis的速度非常快,每秒能执行约11万,每秒约81000条记录。

(2)支持丰富的数据类型:Redis支持更大多数开发人员已经知道像列表,,有序,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。

(3)操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。

(4)多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。

1.3、Redis缺点:

(1)单线程

(2)耗内存

十、Shiro

ApacheShiro是Java的一个安全框架,旨在简化身份验证和授权。Shiro在JavaSE和JavaEE项目中都可以使用。它主要用来处理身份认证,授权,企业会话管理和加密等。Shiro的具体功能点如下:

(1)身份认证/登录,验证用户是不是拥有相应的身份;

(2)授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;

(3)会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的;

(4)加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;

(5)Web支持,可以非常容易的集成到Web环境;

Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;

(6)shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;

(7)提供测试支持;

(8)允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;

(9)记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。

Shiro的 rememberMe 功能使用指导为什么rememberMe设置了没作用

官方清缺的文档有说明,isRemembered和isAuthenticated是互斥的

isRemembered是在服务器上记录一个cookie说明你这个用户登陆过并答塌辩且被记住了

效果类似于亚马逊页面上,他会记衫孝住近期登陆过的用户(Subject)

但是你进行敏感操作的时候还是要重新登录敲账号密码的,也就是必须重新进行Authentication

也就是说如果你的拦截器配置了authc或者其他需要认证之后才能使用的

shiro的rememberMe功能就不起作用了

印象中有一个url拦截器可以过滤这个,不记得名字了

采用这个解决方案的前提是,你必须自己先实现一个realm,不过这个我相信大家都会实现的,毕竟默认的不是jdbcRealm ,真正的项目都是要查数据库才能确定用户是否登录的。那么我就假定大家的项目中都有那么一个负责验证登录的 JdbcRealm, 并且是采用用户名密码认证的,在 doGetAuthenticationInfo 方法里面是采用如下的方轿枯穗法来做认证

info = new SimpleAuthenticationInfo(username, password.toCharArray(), getName());

这个前提条件保证你的闭卜principal是username,相信大部分人根据教程做shiro的时候都采用了这种方式

STEP1 复写 FormAuthenticationFilter 的 isAccessAllowed 方法败枯

做一个新类继承FormAuthenticationFilter ,并复写 isAccessAllowed 方法

package com.yqr.jxc.shiro;

import javax.annotation.Resource;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import org.apache.shiro.session.Session;

import org.apache.shiro.subject.Subject;

import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;

import com.yqr.jxc.service.global.GlobalUserService;

public class RememberAuthenticationFilter extends FormAuthenticationFilter {

@Resource(name=”globalUserService”)

private GlobalUserService globalUserService;

/**

* 这个方法决定了是否能让用户登录

*/

@Override

protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {

Subject subject = getSubject(request, response);

//如果 isAuthenticated 为 false 证明不是登录过的,同时 isRememberd 为true 证明是没登陆直接通过记住我功能进来的

if(!subject.isAuthenticated() && subject.isRemembered()){

//获取session看看是不是空的

Session session = subject.getSession(true);

//随便拿session的一个属性来看session当前是否是空的,我用userId,你们的项目可以自行发挥

if(session.getAttribute(“userId”) == null){

//如果是空的才初始化,否则每次都要初始化,项目得慢死

//这边根据前面的前提假设,拿到的是username

String username = subject.getPrincipal().toString();

//在这个方法里面做初始化用户上下文的事情,比如通过查询数据库来设置session值,你们自己发挥

globalUserService.initUserContext(username, subject);

}

}

//这个方法本来只返回 subject.isAuthenticated() 现在我们加上 subject.isRemembered() 让它同时也兼容remember这种情况

return subject.isAuthenticated() || subject.isRemembered();

}

}

STEP2 设置使用这个新的 AuthenticationFilter (认证过滤器)

如果你用的是spring那么

/** = rememberAuthFilter

如果你用的是 ini 文件,那么

rememberAuthFilter=com.yqr.jxc.shiro.RememberAuthenticationFilter

#将之前的 /** = authc 替换成 rememberAuthFilter

/** = rememberAuthFilter

然后重启项目我们来测试一下,先登录一次系统,然后直接关掉浏览器,然后打开浏览器直接输入系统某个页面的地址,发现可以直接进去了,session什么的也设置好了

成都服务器租用选创新互联,先试用再开通。
创新互联(www.cdcxhl.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。物理服务器托管租用:四川成都、绵阳、重庆、贵阳机房服务器托管租用。

名称栏目:Shiro安全框架:数据库更新注意事项 (shiro更新数据库)
分享地址:http://www.shufengxianlan.com/qtweb/news39/471589.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联