Shiro是一个Java安全框架,它提供了认证、授权、加密等安全功能,广泛应用于企业级应用程序的开发中。Shiro的配置文件中包含了很多重要的参数和配置信息,其中数据库配置文件是非常关键的一部分。本文将详细介绍Shiro安全框架数据库配置文件的内容和作用。
一、数据库中的表结构
在Shiro框架中,用户信息和权限信息都存储在数据库中,我们需要在数据库中创建相关的表结构。Shiro默认的表结构如下:
1.用户表
CREATE TABLE `sys_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘用户id’,
`username` varchar(50) NOT NULL COMMENT ‘用户名’,
`password` varchar(100) NOT NULL COMMENT ‘密码’,
`salt` varchar(50) DEFAULT NULL COMMENT ‘盐值’,
`state` tinyint(4) NOT NULL DEFAULT ‘0’ COMMENT ‘状态(0:正常,1:锁定)’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’用户表’;
2.角色表
CREATE TABLE `sys_role` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘角色id’,
`role_name` varchar(50) NOT NULL COMMENT ‘角色名称’,
`role_desc` varchar(100) DEFAULT NULL COMMENT ‘角色描述’,
`avlable` tinyint(4) NOT NULL DEFAULT ‘0’ COMMENT ‘状态(0:可用,1:不可用)’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’角色表’;
3.权限表
CREATE TABLE `sys_permission` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘权限id’,
`permission_name` varchar(50) NOT NULL COMMENT ‘权限名称’,
`permission_url` varchar(200) DEFAULT NULL COMMENT ‘权限URL’,
`avlable` tinyint(4) NOT NULL DEFAULT ‘0’ COMMENT ‘状态(0:可用,1:不可用)’,
`parent_id` bigint(20) DEFAULT NULL COMMENT ‘父权限id’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’权限表’;
4.用户角色关系表
CREATE TABLE `sys_user_role` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘用户角色关系id’,
`user_id` bigint(20) NOT NULL COMMENT ‘用户id’,
`role_id` bigint(20) NOT NULL COMMENT ‘角色id’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’用户角色关系表’;
5.角色权限关系表
CREATE TABLE `sys_role_permission` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘角色权限关系id’,
`role_id` bigint(20) NOT NULL COMMENT ‘角色id’,
`permission_id` bigint(20) NOT NULL COMMENT ‘权限id’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’角色权限关系表’;
二、数据库配置文件
Shiro安全框架的数据库配置文件是Shiro的核心配置之一,它保存了Shiro框架中数据库连接的相关信息、表结构信息和查询语句等。本节将详细介绍Shiro安全框架数据库配置文件的每个配置项的作用和参数设置方法。
1.数据库连接信息配置
Shiro框架需要连接数据库才能读取用户信息和权限信息,因此,数据库连接信息是配置文件中最重要的一部分。下面是Shiro框架的数据库连接信息配置模板:
[mn]
# 数据库连接配置
jdbcDriver = com.mysql.jdbc.Driver
jdbcUrl = jdbc:mysql://localhost:3306/shiro?useUnicode=true&characterEncoding=utf8
jdbcUsername = root
jdbcPassword = root
其中,jdbcDriver是数据库驱动程序的名称,jdbcUrl是数据库连接字符串,jdbcUsername和jdbcPassword是数据库的登录用户名和密码。需要注意的是,如果使用非默认的数据库,则需要修改jdbcUrl配置项的内容。
2.表结构信息配置
Shiro框架需要读取数据库中的用户信息表、角色信息表和权限信息表,并且根据它们的关系建立用户角色关系表和角色权限关系表。下面是Shiro框架的数据库表结构信息配置模板:
[roles]
# 用户信息表名称
userTable = sys_user
# 用户名字段名称
usernameColumn = username
# 密码字段名称
passwordColumn = password
# 盐值字段名称
saltColumn = salt
[roles]
# 角色信息表名称
roleTable = sys_role
# 角色名字段名称
roleNameColumn = role_name
# 角色描述字段名称
roleDescColumn = role_desc
# 是否可用字段名称
roleAvlableColumn=avlable
[permissions]
# 权限信息表名称
permissionTable = sys_permission
# 权限名字段名称
permissionNameColumn = permission_name
# 权限url字段名称
permissionUrlColumn = permission_url
# 是否可用字段名称
permissionAvlableColumn = avlable
# 父权限id字段名称
permissionParentColumn = parent_id
[user_role]
# 用户角色关系表名称
userRoleTable = sys_user_role
# 用户id字段名称
userIdColumn = user_id
# 角色id字段名称
roleIdColumn = role_id
[role_permission]
# 角色权限关系表名称
rolePermissionTable = sys_role_permission
# 角色id字段名称
roleIdColumn = role_id
# 权限id字段名称
permissionIdColumn = permission_id
其中,[roles]、[permissions]、[user_role]和[role_permission]是配置文件的子标签,它们分别表示用户表信息、角色表信息、权限表信息、用户角色关系表信息和角色权限关系表信息。每个子标签中的参数名称和作用如下:
userTable:用户信息表名称
usernameColumn:用户名字段名称
passwordColumn:密码字段名称
saltColumn:盐值字段名称
roleTable:角色信息表名称
roleNameColumn:角色名字段名称
roleDescColumn:角色描述字段名称
roleAvlableColumn:是否可用字段名称
permissionTable:权限信息表名称
permissionNameColumn:权限名字段名称
permissionUrlColumn:权限url字段名称
permissionAvlableColumn:是否可用字段名称
permissionParentColumn:父权限id字段名称
userRoleTable:用户角色关系表名称
userIdColumn:用户id字段名称
roleIdColumn:角色id字段名称
rolePermissionTable:角色权限关系表名称
roleIdColumn:角色id字段名称
permissionIdColumn:权限id字段名称
3.查询语句配置
Shiro框架使用SQL语句查询数据库中的用户信息和权限信息,查询语句包括查询所有用户信息、查询用户角色信息、查询角色权限信息等。下面是Shiro框架的查询语句配置模板:
[roles]
# 查询单个用户信息
userSql = select password,salt from sys_user where username = ?
# 查询用户角色信息
rolesSql = select r.role_name from sys_user_role ur, sys_role r where ur.role_id = r.id and ur.user_id = (select id from sys_user where username = ?)
# 查询所有角色信息
allRolesSql = select role_name from sys_role
# 查询角色权限信息
permissionsSql = select p.permission_name from sys_role_permission rp,sys_permission p where rp.permission_id = p.id and rp.role_id = (select id from sys_role where role_name = ?)
其中,[roles]是配置文件的子标签,它表示角色信息相关查询语句。每个子标签中的参数名称和作用如下:
userSql:查询单个用户信息的SQL语句,其中?表示用户名参数
rolesSql:查询用户角色信息的SQL语句,其中?表示用户名参数
allRolesSql:查询所有角色信息的SQL语句
permissionsSql:查询角色权限信息的SQL语句,其中?表示角色名参数
三、数据库配置文件示例
下面是一个完整的Shiro安全框架数据库配置文件示例:
[mn]
# 数据库连接配置
jdbcDriver = com.mysql.jdbc.Driver
jdbcUrl = jdbc:mysql://localhost:3306/shiro?useUnicode=true&characterEncoding=utf8
jdbcUsername = root
jdbcPassword = root
[roles]
# 用户表信息
userTable = sys_user
usernameColumn = username
passwordColumn = password
saltColumn = salt
# 角色表信息
roleTable = sys_role
roleNameColumn = role_name
roleDescColumn = role_desc
roleAvlableColumn=avlable
# 权限表信息
permissionTable = sys_permission
permissionNameColumn = permission_name
permissionUrlColumn = permission_url
permissionAvlableColumn = avlable
permissionParentColumn = parent_id
# 用户角色关系表信息
userRoleTable = sys_user_role
userIdColumn = user_id
roleIdColumn = role_id
# 角色权限关系表信息
rolePermissionTable = sys_role_permission
roleIdColumn = role_id
permissionIdColumn = permission_id
# 查询单个用户信息
userSql = select password,salt from sys_user where username = ?
# 查询用户角色信息
rolesSql = select r.role_name from sys_user_role ur, sys_role r where ur.role_id = r.id and ur.user_id = (select id from sys_user where username = ?)
# 查询所有角色信息
allRolesSql = select role_name from sys_role
# 查询角色权限信息
permissionsSql = select p.permission_name from sys_role_permission rp,sys_permission p where rp.permission_id = p.id and rp.role_id = (select id from sys_role where role_name = ?)
上述配置文件中,包括了数据库连接信息、表信息和查询语句信息,开发人员只需要修改其中相应的参数即可使Shiro框架连接到自己的数据库。
Shiro安全框架的数据库配置文件是Shiro功能完整性的关键之一,它保存了Shiro框架中数据库连接的相关信息、表结构信息和查询语句等。开发人员可以根据自己的需求进行相应的修改和配置。
成都网站建设公司-创新互联为您提供网站建设、网站制作、网页设计及定制高端网站建设服务!
采用这个解决方案的前提是,你必须自己先实现一个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什么的也设置好了
官方的文档有说明,isRemembered和isAuthenticated是互斥的
isRemembered是在服务器上记录一个cookie说明你这个用户登陆过并且被记住了
效果类似于亚马逊页面上,他会记住近期登陆过的用户(Subject)
但是你进行敏感操作的时候还是要重新登录敲账号密码的,也就是必须重新进行Authentication
也就是说如果你的拦截器配置了authc或者其他需要认证之后才能使用的
shiro的rememberMe功能就不起作用了
印象中有一个url拦截器可以过滤这个,不记得名字了
香港云服务器机房,创新互联(www.cdcxhl.com)专业云服务器厂商,回大陆优化带宽,安全/稳定/低延迟.创新互联助力企业出海业务,提供一站式解决方案。香港服务器-免备案低延迟-双向CN2+BGP极速互访!
网站名称:Shiro安全框架数据库配置文件详解(shiro数据库配置文件)
标题路径:http://www.shufengxianlan.com/qtweb/news45/313245.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联