Appendix A. 安全数据库表结构
可以为框架采用不同的数据库结构,这个附录为所有功能提供了一种参考形式。 你只要为需要的功能部分提供对应的表结构。
这些DDL语句都是对应于HSQLDB数据库的。 你可以把它们当作一个指南,参照它,在你使用的数据库中定义表结构。
UserDetailsService
的标准JDBC实现(JdbcDaoImpl
),需要从这些表里读取用户的密码,帐号信息(可用或禁用)和权限(角色)列表。
create table users( username varchar_ignorecase(50) not null primary key, password varchar_ignorecase(50) not null, enabled boolean not null); create table authorities ( username varchar_ignorecase(50) not null, authority varchar_ignorecase(50) not null, constraint fk_authorities_users foreign key(username) references users(username)); create unique index ix_auth_username on authorities (username,authority);
Spring Security 2.0在JdbcDaoImpl
中支持了权限分组。 如果启用了权限分组功能,对应的数据库结果如下所示:
create table groups ( id bigint generated by default as identity(start with 0) primary key, group_name varchar_ignorecase(50) not null); create table group_authorities ( group_id bigint not null, authority varchar(50) not null, constraint fk_group_authorities_group foreign key(group_id) references groups(id)); create table group_members ( id bigint generated by default as identity(start with 0) primary key, username varchar(50) not null, group_id bigint not null, constraint fk_group_members_group foreign key(group_id) references groups(id));
这个表用来保存安全性更高的持久登陆remember-me实现所需要的数据。 如果你直接或通过命名空间使用了JdbcTokenRepositoryImpl
,你就会需要这些表结构。
create table persistent_logins ( username varchar(64) not null, series varchar(64) primary key, token varchar(64) not null, last_used timestamp not null);
这里有四个表被Spring Security用来实现 ACL。
-
acl_sid
保存被ACL系统分配的安全标示符。 它们可能是唯一的实体或可能分配给多个实体的权限。 -
acl_class
定义ACL可以处理的实体类型。class
列保存了对象的Java类名。 -
acl_object_identity
保存值得那个领域对象昂的对象标示定义。 -
acl_entry
保存ACL权限,分配给一个特定的对象标示和安全标示。
假设数据库会自动生成主键作为每个标示。 JdbcMutableAclService
必须可以获得这些,当创建了一个新的 acl_sid
或acl_class
表中的数据。 它有两个属性可以定义需要的SQL来获得这些数据, classIdentityQuery
和sidIdentityQuery
。 这两个属性的默认值是call identity()
。
默认的表结构可以工作在内嵌的HSQLDB中,可以在框架内用作单元测试。
create table acl_sid ( id bigint generated by default as identity(start with 100) not null primary key, principal boolean not null, sid varchar_ignorecase(100) not null, constraint unique_uk_1 unique(sid,principal) ); create table acl_class ( id bigint generated by default as identity(start with 100) not null primary key, class varchar_ignorecase(100) not null, constraint unique_uk_2 unique(class) ); create table acl_object_identity ( id bigint generated by default as identity(start with 100) not null primary key, object_id_class bigint not null, object_id_identity bigint not null, parent_object bigint, owner_sid bigint not null, entries_inheriting boolean not null, constraint unique_uk_3 unique(object_id_class,object_id_identity), constraint foreign_fk_1 foreign key(parent_object) references acl_object_identity(id), constraint foreign_fk_2 foreign key(object_id_class) references acl_class(id), constraint foreign_fk_3 foreign key(owner_sid) references acl_sid(id) ); create table acl_entry ( id bigint generated by default as identity(start with 100) not null primary key, acl_object_identity bigint not null,ace_order int not null,sid bigint not null, mask integer not null,granting boolean not null,audit_success boolean not null, audit_failure boolean not null, constraint unique_uk_4 unique(acl_object_identity,ace_order), constraint foreign_fk_4 foreign key(acl_object_identity) references acl_object_identity(id), constraint foreign_fk_5 foreign key(sid) references acl_sid(id) );
create table acl_sid( id bigserial not null primary key, principal boolean not null, sid varchar(100) not null, constraint unique_uk_1 unique(sid,principal)); create table acl_class( id bigserial not null primary key, class varchar(100) not null, constraint unique_uk_2 unique(class)); create table acl_object_identity( id bigserial primary key, object_id_class bigint not null, object_id_identity bigint not null, parent_object bigint, owner_sid bigint, entries_inheriting boolean not null, constraint unique_uk_3 unique(object_id_class,object_id_identity), constraint foreign_fk_1 foreign key(parent_object) references acl_object_identity(id), constraint foreign_fk_2 foreign key(object_id_class) references acl_class(id), constraint foreign_fk_3 foreign key(owner_sid) references acl_sid(id)); create table acl_entry( id bigserial primary key, acl_object_identity bigint not null, ace_order int not null, sid bigint not null, mask integer not null, granting boolean not null, audit_success boolean not null, audit_failure boolean not null, constraint unique_uk_4 unique(acl_object_identity,ace_order), constraint foreign_fk_4 foreign key(acl_object_identity) references acl_object_identity(id), constraint foreign_fk_5 foreign key(sid) references acl_sid(id));
你需要把classIdentityQuery
和 sidIdentityQuery
两个 JdbcMutableAclService
的属性设置成下面的值:
-
select currval(pg_get_serial_sequence('acl_class', 'id'))
-
select currval(pg_get_serial_sequence('acl_sid', 'id'))
相关推荐
在Spring Security中,用户信息通常存储在一个持久化的数据源中,如数据库。通过UserDetailsService接口,我们可以自定义实现来加载用户信息。用户与角色之间的关系通常通过用户角色表来建立,而角色则赋予了用户...
自定义数据库表结构”的文档中,我们将探讨如何根据企业特定的需求来定制Spring Security的数据库表结构,并且如何初始化数据以及获取自定义的用户权限信息。Spring Security默认的表结构可能无法满足所有企业的...
目标是将现有的Acegi配置迁移到Spring Security 2.0,同时保持使用数据库作为认证和授权数据源的能力,避免依赖XML配置文件。 24.3. 实现步骤 要实现这一目标,首先需要将Spring Security 2.0的库文件添加到项目的...
**自定义数据库表结构** Spring Security 默认使用内存中的用户和角色存储,但在实际应用中,通常需要将这些信息存储在数据库中。为了实现这一点,我们需要配置`UserDetailsService`接口并实现自己的数据访问层。...
Spring Security 数据库表结构实例代码 Spring Security 是一个基于 Java 的安全框架,它提供了强大的身份验证、授权和访问控制机制。在本文中,我们将介绍 Spring Security 数据库表结构实例代码,帮助开发者快速...
Spring Security支持通过修改配置文件来连接数据库,并定义所需的数据库表结构。可以自定义数据库表结构和初始化数据,以便从数据库中获取用户权限信息。处理用户登录和检验用户权限是数据库管理用户权限的重要环节...
标题与描述均提到了“Spring Security 2 配置说明”,这表明文章旨在阐述Spring Security 2版本的配置细节,尤其是对于那些希望深入了解并正确应用该框架的安全特性开发者们。以下将基于给定的部分内容,深入解析...
首先说声抱歉,上次发布的项目不是源代码。我没看清楚就发布了。...(5)项目采用的是5张数据表结构。前台及后台各采用了5张数据库表。当然你也可以进行修改后合并。 (6)数据库采用MYSQL 备份文件在src文件夹下。
在提供的压缩包中,`securitydb_2.sql`很可能包含了预设的数据库结构和初始数据,这些数据可能是为了设置Spring Security的安全配置,如用户角色、权限等。这通常涉及创建用户表、角色表以及它们之间的关联。执行这...
接下来,我们来看看如何在MySQL中设计ACL相关的表结构。通常,你需要创建以下几个核心表: 1. `acl_class`: 存储数据对象的类信息,例如"com.example.MyEntity"。 2. `acl_object_identity`: 对应每一个数据对象,...
通过实现自定义的数据库表结构,可以更好地适应业务需求,包括初始化数据和获取自定义用户权限信息。 自定义登陆页面是Spring Security提供的另一个灵活性功能,允许开发者创建个性化的登陆界面以提升用户体验。...
该资源是springsecurity+oauth2+jwt实现的单点登录demo,模式为授权码模式,...应用数据存在内存中或者存在数据库中(附带数据库表结构),token存储分为数据库或者Redis。demo包含服务端和客户端,可直接运行测试。
这个SQL文件包含了数据库的结构和初始数据,可能是预先设计好的表和数据,用于初始化项目所需的安全相关数据,如用户账户、角色等。开发者可以通过导入这个SQL文件来设置好项目的基础数据环境。 综上所述,这个项目...
在Spring Security中,角色继承允许我们创建一种层次结构,其中某些角色可以包含或扩展其他角色的权限。例如,我们可以定义一个"管理员"角色,它包含"用户"角色的所有权限,并可能有额外的特权。要实现角色继承,...
- **自定义表结构:** 根据项目的具体需求,自定义数据库表结构以存储更加复杂的用户信息和权限数据。 - **初始化数据:** 在数据库中填充初始数据,以便后续的测试和验证。 - **获得自定义用户权限信息:** - *...
【标题】"maven-ssh-spring security" 涉及到的是在Java开发中使用Maven构建的一个集成Spring Security的SSH(Struts2、Spring、Hibernate)项目。SSH是Java Web开发中常见的三大框架,而Spring Security则是一个...
- 指导如何根据项目的具体需求来自定义数据库表结构,以便更好地支持权限管理功能。 - **3.2 初始化数据** - 介绍如何在项目启动时或首次部署时初始化数据库表中的必要数据。 - **3.3 获得自定义用户权限信息** -...
SpringSecurity通常依赖于`users`、`authorities`和`sessions`等表,具体结构可以参考官方文档。 通过深入研究源码,你可以了解SpringSecurity如何处理各种安全场景,如何配置和扩展其功能,以及如何将它与其他...