13

我想为我的领域使用 Apache Shiro 和 MySQL。Shiro 需要处理哪些表和字段?

4

3 回答 3

17

Shiro不需要数据库表来运行。Shiro 用户可以使用他们想要建模或管理用户、组、权限等的任何数据存储。

Shiro Realm有责任充当数据的桥梁(无论您想如何表示它)并以 Shiro 理解的格式返回它。

因为 Shiro 不会强加数据模型给你,这就是它允许它与这么多后端(LDAP、Active Directory、RDBMS、文件系统等)一起工作的原因。

如果您想使用 RDBMS 作为您的后备数据存储,请查看 Shiro 的JdbcRealm源代码,让您了解您的表可能是什么样子。这只是一个例子。你可以有任何你想要的表结构。

于 2011-03-30T19:24:12.417 回答
7

据我了解,它只需要 3 个,我有 3 个表和 2 个视图,用作框架的数据源。我在 Postgresql 上有这个,但你可以调整它以在其他数据库中使用。

试试这个

CREATE SCHEMA app;

CREATE TABLE app.sec_permissions ( 
    permission_id int4 NOT NULL,
    permission_name varchar( 64 ) NOT NULL,
    role_id int4 NOT NULL,
CONSTRAINT pk_sec_permissions PRIMARY KEY ( permission_id ),
CONSTRAINT idx_sec_permissions_unq_name UNIQUE ( permission_name )
 );

CREATE INDEX idx_sec_permissions ON app.sec_permissions ( role_id );

CREATE TABLE app.sec_roles ( 
    role_id int4 NOT NULL,
    role_name varchar( 32 ) NOT NULL,
    user_id int4 NOT NULL,
CONSTRAINT pk_sec_roles_0 PRIMARY KEY ( role_id ),
CONSTRAINT idx_sec_roles_unq_name UNIQUE ( role_name )
 );

CREATE INDEX idx_sec_roles ON app.sec_roles ( user_id );

CREATE TABLE app.sec_users ( 
    user_id int4 NOT NULL,
    user_loginname varchar( 32 ) NOT NULL,
    user_password varchar( 254 ) NOT NULL,
    user_passsalt varchar( 254 ) NOT NULL,
CONSTRAINT pk_sec_users PRIMARY KEY ( user_id ),
CONSTRAINT idx_sec_users_unq_loginname UNIQUE ( user_loginname )
 )
;

ALTER TABLE app.sec_permissions ADD CONSTRAINT fk_sec_permissions FOREIGN KEY ( role_id ) REFERENCES app.sec_roles( role_id ) ON DELETE CASCADE ON UPDATE CASCADE
;

ALTER TABLE app.sec_roles ADD CONSTRAINT fk_sec_roles FOREIGN KEY ( user_id ) REFERENCES app.sec_users( user_id ) ON DELETE CASCADE ON UPDATE CASCADE
;

CREATE VIEW app.sec_loginname_roles AS SELECT 
  su.user_loginname
, su.user_password
, su.user_passsalt
, sr.role_name

FROM 
app.sec_users su 
    INNER JOIN app.sec_roles sr 
    ON 
           ( su.user_id = sr.user_id  );

CREATE VIEW app.sec_role_permissions AS SELECT sr.role_name, sp.permission_name
FROM app.sec_roles sr 
    INNER JOIN app.sec_permissions sp ON ( sr.role_id = sp.role_id  );

如果您发现有问题,请回帖

于 2011-12-29T23:45:02.047 回答
1

浏览一下 Shiro 的快速启动页面Realm 文档页面,根本没有提到任何关于 MySQL 或数据库的内容。基于此,似乎不需要任何特定的

于 2011-03-30T13:21:00.903 回答