新聞中心
Shiro是一個Java安全框架,它提供了認證、授權、加密等安全功能,廣泛應用于企業(yè)級應用程序的開發(fā)中。Shiro的配置文件中包含了很多重要的參數(shù)和配置信息,其中數(shù)據(jù)庫配置文件是非常關鍵的一部分。本文將詳細介紹Shiro安全框架數(shù)據(jù)庫配置文件的內容和作用。

一、數(shù)據(jù)庫中的表結構
在Shiro框架中,用戶信息和權限信息都存儲在數(shù)據(jù)庫中,我們需要在數(shù)據(jù)庫中創(chuàng)建相關的表結構。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 ‘狀態(tài)(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 ‘狀態(tài)(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 ‘狀態(tài)(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=’角色權限關系表’;
二、數(shù)據(jù)庫配置文件
Shiro安全框架的數(shù)據(jù)庫配置文件是Shiro的核心配置之一,它保存了Shiro框架中數(shù)據(jù)庫連接的相關信息、表結構信息和查詢語句等。本節(jié)將詳細介紹Shiro安全框架數(shù)據(jù)庫配置文件的每個配置項的作用和參數(shù)設置方法。
1.數(shù)據(jù)庫連接信息配置
Shiro框架需要連接數(shù)據(jù)庫才能讀取用戶信息和權限信息,因此,數(shù)據(jù)庫連接信息是配置文件中最重要的一部分。下面是Shiro框架的數(shù)據(jù)庫連接信息配置模板:
[mn]
# 數(shù)據(jù)庫連接配置
jdbcDriver = com.mysql.jdbc.Driver
jdbcUrl = jdbc:mysql://localhost:3306/shiro?useUnicode=true&characterEncoding=utf8
jdbcUsername = root
jdbcPassword = root
其中,jdbcDriver是數(shù)據(jù)庫驅動程序的名稱,jdbcUrl是數(shù)據(jù)庫連接字符串,jdbcUsername和jdbcPassword是數(shù)據(jù)庫的登錄用戶名和密碼。需要注意的是,如果使用非默認的數(shù)據(jù)庫,則需要修改jdbcUrl配置項的內容。
2.表結構信息配置
Shiro框架需要讀取數(shù)據(jù)庫中的用戶信息表、角色信息表和權限信息表,并且根據(jù)它們的關系建立用戶角色關系表和角色權限關系表。下面是Shiro框架的數(shù)據(jù)庫表結構信息配置模板:
[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]是配置文件的子標簽,它們分別表示用戶表信息、角色表信息、權限表信息、用戶角色關系表信息和角色權限關系表信息。每個子標簽中的參數(shù)名稱和作用如下:
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語句查詢數(shù)據(jù)庫中的用戶信息和權限信息,查詢語句包括查詢所有用戶信息、查詢用戶角色信息、查詢角色權限信息等。下面是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]是配置文件的子標簽,它表示角色信息相關查詢語句。每個子標簽中的參數(shù)名稱和作用如下:
userSql:查詢單個用戶信息的SQL語句,其中?表示用戶名參數(shù)
rolesSql:查詢用戶角色信息的SQL語句,其中?表示用戶名參數(shù)
allRolesSql:查詢所有角色信息的SQL語句
permissionsSql:查詢角色權限信息的SQL語句,其中?表示角色名參數(shù)
三、數(shù)據(jù)庫配置文件示例
下面是一個完整的Shiro安全框架數(shù)據(jù)庫配置文件示例:
[mn]
# 數(shù)據(jù)庫連接配置
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 = ?)
上述配置文件中,包括了數(shù)據(jù)庫連接信息、表信息和查詢語句信息,開發(fā)人員只需要修改其中相應的參數(shù)即可使Shiro框架連接到自己的數(shù)據(jù)庫。
Shiro安全框架的數(shù)據(jù)庫配置文件是Shiro功能完整性的關鍵之一,它保存了Shiro框架中數(shù)據(jù)庫連接的相關信息、表結構信息和查詢語句等。開發(fā)人員可以根據(jù)自己的需求進行相應的修改和配置。
成都網(wǎng)站建設公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設、網(wǎng)站制作、網(wǎng)頁設計及定制高端網(wǎng)站建設服務!
Shiro的 rememberMe 功能使用指導為什么rememberMe設置了沒作用
采用這個解決方案的前提是,你必須自己先實現(xiàn)一個realm,不過這個我相信大家都會實現(xiàn)的,畢竟默認的不是jdbcRealm ,真正的項目都是要查數(shù)據(jù)庫才能確定用戶是否登錄的。那么我就假定大家的項目中都有那么一個負責驗證登錄的 JdbcRealm, 并且是采用用戶名密碼認證的,在 doGetAuthenticationInfo 方法里面是采用如下的方法來做認證
…
info = new SimpleAuthenticationInfo(username, password.toCharArray(), getName());
這個前提條件保證你的principal是username,相信大部分人根據(jù)教程做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,你們的項目可以自行發(fā)揮
if(session.getAttribute(“userId”) == null){
//如果是空的才初始化,否則每次都要初始化,項目得慢死
//這邊根據(jù)前面的前提假設,拿到的是username
String username = subject.getPrincipal().toString();
//在這個方法里面做初始化用戶上下文的事情,比如通過查詢數(shù)據(jù)庫來設置session值,你們自己發(fā)揮
globalUserService.initUserContext(username, subject);
}
}
//這個方法本來只返回 subject.isAuthenticated() 現(xiàn)在我們加上 subject.isRemembered() 讓它同時也兼容remember這種情況
return subject.isAuthenticated() || subject.isRemembered();
}
}
STEP2 設置使用這個新的 AuthenticationFilter (認證過濾器)
如果你用的是spring那么
…
/** = rememberAuthFilter
…
如果你用的是 ini 文件,那么
rememberAuthFilter=com.yqr.jxc.shiro.RememberAuthenticationFilter
#將之前的 /** = authc 替換成 rememberAuthFilter
…
/** = rememberAuthFilter
然后重啟項目我們來測試一下,先登錄一次系統(tǒng),然后直接關掉瀏覽器,然后打開瀏覽器直接輸入系統(tǒng)某個頁面的地址,發(fā)現(xiàn)可以直接進去了,session什么的也設置好了
官方的文檔有說明,isRemembered和isAuthenticated是互斥的
isRemembered是在服務器上記錄一個cookie說明你這個用戶登陸過并且被記住了
效果類似于亞馬遜頁面上,他會記住近期登陸過的用戶(Subject)
但是你進行敏感操作的時候還是要重新登錄敲賬號密碼的,也就是必須重新進行Authentication
也就是說如果你的攔截器配置了authc或者其他需要認證之后才能使用的
shiro的rememberMe功能就不起作用了
印象中有一個url攔截器可以過濾這個,不記得名字了
香港云服務器機房,創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)云服務器廠商,回大陸優(yōu)化帶寬,安全/穩(wěn)定/低延遲.創(chuàng)新互聯(lián)助力企業(yè)出海業(yè)務,提供一站式解決方案。香港服務器-免備案低延遲-雙向CN2+BGP極速互訪!
新聞名稱:Shiro安全框架數(shù)據(jù)庫配置文件詳解(shiro數(shù)據(jù)庫配置文件)
標題路徑:http://m.fisionsoft.com.cn/article/djdicjd.html


咨詢
建站咨詢
