三种是细分角色和权限,并将用户、角色、权限和资源均采用数据库存储,并且自定义过滤器,代替原有的FilterSecurityInterceptor过滤器,
并分别实现AccessDecisionManager、InvocationSecurityMetadataSourceService和UserDetailsService,并在配置文件中进行相应配置。
目前这种方式已经实现,并经过验证。
四是修改spring security的源代码,主要是修改InvocationSecurityMetadataSourceService和UserDetailsService两个类。
前者是将配置文件或数据库中存储的资源(url)提取出来加工成为url和权限列表的Map供Security使用,后者提取用户名和权限组成一个完整的(UserDetails)User对象,该对象可以提供用户的详细信息供AuthentationManager进行认证与授权使用。
该方法理论上可行,但是比较暴力,也没有时间实现,未验证,以后再研究。
说明一下,我目前调通的环境为: java1.6 + struts2.1.6 + spring3.0.1 + hibernate3.3.1 + spring security3.0.2 + oracle9i + weblogic10.3,
顺便提一下,目前(2011-4-2)serutity的最新版本为3.1,比较稳定的版本为3.0.5和2.0.6。
在spring-security-samples-tutorial-3.0.2.RELEASE的例子里,硬编码的配置请参见applicationContext-security.xml文件中的内容。
里面配置了用户名、经过MD5加密后的密码密文、相关的权限,以及与权相对应的访问资源(URL)。还有对于Session超时时的处理。
特别是因为版本号为3.0.2,因此还增加了对表达式的配置演示,具体内容请参见该例子。
可能要有人要问,用户表里面的密码是如何取得的呢?这个密码是通过MD5进行加密过的,并且以用户名做为了盐值,最后就成为32位数字这个样子,这个你可以参见下面applicationContext-Security.xml中的password-encoder和salt-source的配置就会明白。
那么在spring security3中是如何加密的呢?当我们设置了pawwrod-encoder和salt-source之后,Spring Security3会根据配置,采用相匹配的加密算法(比如设置了MD5加密算法)再加上salt-source进行加密,形成32位数字的密文。
比如用户名为yew,密码为yew1234,盐值为用户名yew。那么最后加密的明文为“yew1234{yew}”,密文就为“8fe2657d1599dba8e78a7a0bda8651bb”。
当然,首次使用Spring serutiry,在整合的过程中,我还是遇见了不少问题,当然有些问题比如找不到类呀,包呀,和框架的整合呀等问题不作为谈论的重点。主要还是探讨Spring Security的配置和注意事项的问题。
我在其中碰到的对我印象最深的问题是,当完全配置好之后,重启Web服务器,却发现Spring Security不能拦截任何的URL了,这使我感到惊诧,因为在去年时,我已经将该框架搭建完成,在当时正是使用的该种方法,并且在试验是否能够拦截jsp文件时进行了确认是没有问题的。
接下来我又整理了一下applicationContext-security.xml的文件才发现, 除了不需要进行检测的图片及登录页面之外,没有对任何的资源和权限之间的对应关系进行配置,参见下面的代码:
这样一来,spring security3就会认为根本不需要对任何的URL或Action进行检测(注意上面代码中被注释掉的4条配置)。 哈哈,当时这个问题深深动摇了我对Spring security的信心,花费了这么多天的精力,却是这样的结果,当时就在考虑是否有更好的替代品。有点崩溃啊。 还好,深深地求知欲和征服欲让我坚持下来了。
哈哈,这算不算Spring Security的一个Bug呢?没有任何的权限与资源的配置,就认为登录后的用户具有访问任何资源的权限,说起来有点可怕哈。
接下来实现了jsp型URL的拦截之后,我又遇见了不能拦截action的情况,不过经过多次的配置和重启服务试验,终于发现,在配置Action与权限时,一定要在Action的路径前面加“/”斜杠,否则,Spring Security就会对该请求的URL熟视无睹,无视它的存在,即使你在Action的前后加上*号进行匹配也不会起任何作用,哈哈,不禁慨叹Spring Security的牛脾气。
顺便提一下子,Spring Security3需要配置的过滤器是双重的,首先在web.xml中配置一个过滤器代理,参见上述web.xml中的springSecurityFilterChain配置。
我们通常设置过滤的url模式为/*,就是说任何的url访问都要进行过滤,工作量有点大哈。当然我们可以为之设置不同的过滤url模式,比如.action、.do、.jsp等。这样的话,遇到.action或.jsp或.do结尾的url访问,Spring Security就会突然站出来打截,若是其他的访问,Spring Security就会挥一挥手,潇洒地让你路过。
所以说,这个过滤器主要对大的方面进行拦截,一些细小的活儿,还是要交给第二重过滤器。 就是说,这第一重过滤器是个总代理,他威武地管理着一个过滤器链。
那么这第二重过滤器的配置,就是那些所谓的过滤器链,分别包括“记住我”、“登录”、“注销”、“url访问”等的过滤器,这个过滤器依顺序排开,形成一个过滤链条。具体拦截我们明细Url的是一个叫做FilterInterCeptor的伙计,我认为这个家伙是在整个过滤器链条中是最重要的一个,因为我们登录系统之后,要访问的任何资源都必须经得他的同意。 那么这第二重链条就设置在applicationContext-security.xml文件中的<http>元素下面。
什么,你看不到? 忘记告诉你了,从spring security2开始,就使用了命名空间,若你在<http>中设置了auto="true",Spring Security就会在服务启动时自动加载
所有的过滤器链,省事了吧!
当然,spring security3毕竟是西方国家的东西,以英文为主,使用习惯和文化的差异共存,况且为了适应大多数Web应用的权限管理,作者将Spring Security3打造的精简而灵活。精简指Spring Security3对用户和权限的表设计的非常简单,并且没有采用数据库来管理资源(URL)。这样的话,对于我们国人用户来说,是个很大的遗憾,这个遗憾甚至能够影响到我们对安全框架的选型。你想啊,在国内大多数项目中,均设置了比较复杂的权限控制,一般就会涉及到用户、角色、权限、资源4张表,若要加上4张表之间的对应关系表3张,得有7张表才行。
得7张表才行,但是Spring Security3才给我们提供了2张最简洁的表,这足以不能完成国人用户的项目应用。那么在对Spring Security3一无所知的情况下,
我们很容易就会放弃对该安全框架的选型。
不过我得提一下,原文的作者为了考验你的耐性和自信心,故意在代码里面卖了几点小小的关子,因此若是完全按照作者的原文代码装配起来的权限系统,是不会那么顺利地工作的,天下似乎真是没有不花费力气的午餐!在装配完成后,我也是经过九九八十一难的折磨,在用户、角色、权限、资源的
“天下黄河九曲十八弯”里面盘旋迂回,终于到达了成功的彼岸。至此才对Spring Security有了更深层次的理解,更加佩服作者的良苦用心。 哈哈。

prompt PL
/SQL Developer import
file

prompt Created
on 2011年6月1日
by Administrator
set feedback
off
set define
off

prompt Creating SYS_AUTHORITIES
create table SYS_AUTHORITIES

(

AUTHORITY_ID
VARCHAR2(
32)
not null,

AUTHORITY_NAME
VARCHAR2(
40),

AUTHORITY_DESC
VARCHAR2(
100),

ENABLED
NUMBER(
1),

ISSYS
NUMBER(
1),

MODULE
VARCHAR2(
4)

)

tablespace SCJD

pctfree
10

initrans
1

maxtrans
255

storage

(

initial 64K

minextents
1

maxextents unlimited

);

comment
on table SYS_AUTHORITIES
is '权限表';

comment
on column SYS_AUTHORITIES.MODULE
is '所属的子系统,比如平台里面包括10个系统,分别为成本、作业、集输等。';
alter table SYS_AUTHORITIES
add constraint PK_PUB_AUTHORITIES
primary key (AUTHORITY_ID)

using
index

tablespace SCJD

pctfree
10

initrans
2

maxtrans
255

storage

(

initial 64K

minextents
1

maxextents unlimited

);

prompt Creating SYS_RESOURCES
create table SYS_RESOURCES

(

RESOURCE_ID
VARCHAR2(
32)
not null,

RESOURCE_NAME
VARCHAR2(
100),

RESOURCE_DESC
VARCHAR2(
100),

RESOURCE_TYPE
VARCHAR2(
40),

RESOURCE_STRING
VARCHAR2(
200),

PRIORITY
NUMBER(
1),

ENABLED
NUMBER(
1),

ISSYS
NUMBER(
1),

MODULE
VARCHAR2(
4)

)

tablespace SCJD

pctfree
10

initrans
1

maxtrans
255

storage

(

initial 64K

minextents
1

maxextents unlimited

);

comment
on table SYS_RESOURCES
is '资源表';

comment
on column SYS_RESOURCES.PRIORITY
is '(暂不用,保留)';

comment
on column SYS_RESOURCES.MODULE
is '所属的子系统,比如平台里面包括10个系统,分别为成本、作业、集输等。 (暂不用,保留)';
alter table SYS_RESOURCES
add constraint PK_PUB_RESOURCES
primary key (RESOURCE_ID)

using
index

tablespace SCJD

pctfree
10

initrans
2

maxtrans
255

storage

(

initial 64K

minextents
1

maxextents unlimited

);

prompt Creating SYS_AUTHORITIES_RESOURCES
create table SYS_AUTHORITIES_RESOURCES

(

ID
NUMBER(
13)
not null,

AUTHORITY_ID
VARCHAR2(
32),

RESOURCE_ID
VARCHAR2(
32),

ENABLED
NUMBER(
1)

)

tablespace SCJD

pctfree
10

initrans
1

maxtrans
255

storage

(

initial 64K

minextents
1

maxextents unlimited

);

comment
on table SYS_AUTHORITIES_RESOURCES
is '权限资源表';
alter table SYS_AUTHORITIES_RESOURCES
add constraint PK_PUB_AUTHORITIES_RE
primary key (ID)

using
index

tablespace SCJD

pctfree
10

initrans
2

maxtrans
255

storage

(

initial 64K

minextents
1

maxextents unlimited

);
alter table SYS_AUTHORITIES_RESOURCES
add constraint FK_PUB_AUTHORITIES_RE_AU
foreign key (AUTHORITY_ID)
references SYS_AUTHORITIES (AUTHORITY_ID);
alter table SYS_AUTHORITIES_RESOURCES
add constraint FK_PUB_AUTHORITIES_RE_RE
foreign key (RESOURCE_ID)
references SYS_RESOURCES (RESOURCE_ID);

prompt Creating SYS_ROLES
create table SYS_ROLES

(

ROLE_ID
VARCHAR2(
32)
not null,

ROLE_NAME
VARCHAR2(
40),

ROLE_DESC
VARCHAR2(
100),

ENABLED
NUMBER(
1),

ISSYS
NUMBER(
1),

MODULE
VARCHAR2(
4)

)

tablespace SCJD

pctfree
10

initrans
1

maxtrans
255

storage

(

initial 64K

minextents
1

maxextents unlimited

);

comment
on table SYS_ROLES
is '角色表';

comment
on column SYS_ROLES.MODULE
is '所属的子系统,比如平台里面包括10个系统,分别为成本、作业、集输等。';
alter table SYS_ROLES
add constraint PK_PUB_ROLES
primary key (ROLE_ID)

using
index

tablespace SCJD

pctfree
10

initrans
2

maxtrans
255

storage

(

initial 64K

minextents
1

maxextents unlimited

);

prompt Creating SYS_ROLES_AUTHORITIES
create table SYS_ROLES_AUTHORITIES

(

ID
NUMBER(
13)
not null,

ROLE_ID
VARCHAR2(
32),

AUTHORITY_ID
VARCHAR2(
32),

ENABLED
NUMBER(
1)

)

tablespace SCJD

pctfree
10

initrans
1

maxtrans
255

storage

(

initial 64K

minextents
1

maxextents unlimited

);

comment
on table SYS_ROLES_AUTHORITIES
is '角色权限表';
alter table SYS_ROLES_AUTHORITIES
add constraint PK_PUB_ROLES_AUTHORITY
primary key (ID)

using
index

tablespace SCJD

pctfree
10

initrans
2

maxtrans
255

storage

(

initial 64K

minextents
1

maxextents unlimited

);
alter table SYS_ROLES_AUTHORITIES
add constraint FK_PUB_ROLES_AUTHORITIES_AU
foreign key (AUTHORITY_ID)
references SYS_AUTHORITIES (AUTHORITY_ID);
alter table SYS_ROLES_AUTHORITIES
add constraint FK_PUB_ROLES_AUTHORITIES_ROLES
foreign key (ROLE_ID)
references SYS_ROLES (ROLE_ID);

prompt Creating SYS_USERS
create table SYS_USERS

(
USER_ID VARCHAR2(
32)
not null,

USER_ACCOUNT
VARCHAR2(
30),
USER_NAME VARCHAR2(
40),

USER_PASSWORD
VARCHAR2(
100),

USER_DESC
VARCHAR2(
100),

ENABLED
NUMBER(
1),

ISSYS
NUMBER(
1),

USER_DEPT
VARCHAR2(
20),

USER_DUTY
VARCHAR2(
10),

SUB_SYSTEM
VARCHAR2(
30)

)

tablespace SCJD

pctfree
10

initrans
1

maxtrans
255

storage

(

initial 64K

minextents
1

maxextents unlimited

);

comment
on table SYS_USERS
is '用户表';

comment
on column SYS_USERS.USER_PASSWORD
is '该密码是经加盐值加密的,格式为password{username}。 比如用户的密码为user,用户名为user,那么通过MD5进行加密的串为: user{user}';

comment
on column SYS_USERS.ISSYS
is '是否是超级用户';

comment
on column SYS_USERS.USER_DEPT
is '所在单位';

comment
on column SYS_USERS.USER_DUTY
is '经理或主任';

comment
on column SYS_USERS.SUB_SYSTEM
is '该用户所负责的各子系统,可多个,中间用逗号分隔。(目前暂未用,作为保留字段)';
alter table SYS_USERS
add constraint PK_PUB_USERS
primary key (
USER_ID)

using
index

tablespace SCJD

pctfree
10

initrans
2

maxtrans
255

storage

(

initial 64K

minextents
1

maxextents unlimited

);

prompt Creating SYS_USERS_ROLES
create table SYS_USERS_ROLES

(

ID
NUMBER(
13)
not null,
USER_ID VARCHAR2(
32),

ROLE_ID
VARCHAR2(
32),

ENABLED
NUMBER(
1)

)

tablespace SCJD

pctfree
10

initrans
1

maxtrans
255

storage

(

initial 64K

minextents
1

maxextents unlimited

);

comment
on table SYS_USERS_ROLES
is '用户角色表';
alter table SYS_USERS_ROLES
add constraint PK_PUB_USERS_ROLES
primary key (ID)

using
index

tablespace SCJD

pctfree
10

initrans
2

maxtrans
255

storage

(

initial 64K

minextents
1

maxextents unlimited

);
alter table SYS_USERS_ROLES
add constraint FK_USERS_ROLES_ROLES
foreign key (ROLE_ID)
references SYS_ROLES (ROLE_ID);
alter table SYS_USERS_ROLES
add constraint FK_USERS_ROLES_USERS
foreign key (
USER_ID)
references SYS_USERS (
USER_ID);

prompt Disabling triggers
for SYS_AUTHORITIES
alter table SYS_AUTHORITIES disable
all triggers;

prompt Disabling triggers
for SYS_RESOURCES
alter table SYS_RESOURCES disable
all triggers;

prompt Disabling triggers
for SYS_AUTHORITIES_RESOURCES
alter table SYS_AUTHORITIES_RESOURCES disable
all triggers;

prompt Disabling triggers
for SYS_ROLES
alter table SYS_ROLES disable
all triggers;

prompt Disabling triggers
for SYS_ROLES_AUTHORITIES
alter table SYS_ROLES_AUTHORITIES disable
all triggers;

prompt Disabling triggers
for SYS_USERS
alter table SYS_USERS disable
all triggers;

prompt Disabling triggers
for SYS_USERS_ROLES
alter table SYS_USERS_ROLES disable
all triggers;

prompt Disabling
foreign key constraints
for SYS_AUTHORITIES_RESOURCES
alter table SYS_AUTHORITIES_RESOURCES disable
constraint FK_PUB_AUTHORITIES_RE_AU;
alter table SYS_AUTHORITIES_RESOURCES disable
constraint FK_PUB_AUTHORITIES_RE_RE;

prompt Disabling
foreign key constraints
for SYS_ROLES_AUTHORITIES
alter table SYS_ROLES_AUTHORITIES disable
constraint FK_PUB_ROLES_AUTHORITIES_AU;
alter table SYS_ROLES_AUTHORITIES disable
constraint FK_PUB_ROLES_AUTHORITIES_ROLES;

prompt Disabling
foreign key constraints
for SYS_USERS_ROLES
alter table SYS_USERS_ROLES disable
constraint FK_USERS_ROLES_ROLES;
alter table SYS_USERS_ROLES disable
constraint FK_USERS_ROLES_USERS;

prompt Deleting SYS_USERS_ROLES
delete from SYS_USERS_ROLES;
commit;

prompt Deleting SYS_USERS
delete from SYS_USERS;
commit;

prompt Deleting SYS_ROLES_AUTHORITIES
delete from SYS_ROLES_AUTHORITIES;
commit;

prompt Deleting SYS_ROLES
delete from SYS_ROLES;
commit;

prompt Deleting SYS_AUTHORITIES_RESOURCES
delete from SYS_AUTHORITIES_RESOURCES;
commit;

prompt Deleting SYS_RESOURCES
delete from SYS_RESOURCES;
commit;

prompt Deleting SYS_AUTHORITIES
delete from SYS_AUTHORITIES;
commit;

prompt Loading SYS_AUTHORITIES
insert into SYS_AUTHORITIES (AUTHORITY_ID, AUTHORITY_NAME, AUTHORITY_DESC, ENABLED, ISSYS, MODULE)
values (
'1303910437484',
'AUTH_xxx',
'xxx',
null,
null,
'01');
insert into SYS_AUTHORITIES (AUTHORITY_ID, AUTHORITY_NAME, AUTHORITY_DESC, ENABLED, ISSYS, MODULE)
values (
'AUTH_LOGIN4',
'AUTH_LOGIN',
'登录',
1,
0,
'01');
insert into SYS_AUTHORITIES (AUTHORITY_ID, AUTHORITY_NAME, AUTHORITY_DESC, ENABLED, ISSYS, MODULE)
values (
'AUTH_AFTERLOGINWELCOME5',
'AUTH_AFTERLOGINWELCOME',
'登录后欢迎界面',
1,
0,
'01');
insert into SYS_AUTHORITIES (AUTHORITY_ID, AUTHORITY_NAME, AUTHORITY_DESC, ENABLED, ISSYS, MODULE)
values (
'AUTH_XTSZ_DEPT1',
'AUTH_XTSZ_DEPT',
'单位设置',
1,
0,
'01');
insert into SYS_AUTHORITIES (AUTHORITY_ID, AUTHORITY_NAME, AUTHORITY_DESC, ENABLED, ISSYS, MODULE)
values (
'AUTH_XTSZ_USER2',
'AUTH_XTSZ_USER',
'用户设置、横向查询',
1,
0,
'01');
insert into SYS_AUTHORITIES (AUTHORITY_ID, AUTHORITY_NAME, AUTHORITY_DESC, ENABLED, ISSYS, MODULE)
values (
'AUTH_NODE_MGR3',
'AUTH_NODE_MGR',
'节点管理、纵向查询',
1,
0,
'01');
commit;

prompt
6 records loaded

prompt Loading SYS_RESOURCES
insert into SYS_RESOURCES (RESOURCE_ID, RESOURCE_NAME, RESOURCE_DESC, RESOURCE_TYPE, RESOURCE_STRING, PRIORITY, ENABLED, ISSYS, MODULE)
values (
'1303909883031',
'ff',
'ff',
'action',
'b.jsp',
null,
1,
0,
null);
insert into SYS_RESOURCES (RESOURCE_ID, RESOURCE_NAME, RESOURCE_DESC, RESOURCE_TYPE, RESOURCE_STRING, PRIORITY, ENABLED, ISSYS, MODULE)
values (
'1303909847687',
'ff1',
'ff1',
'action',
'b.jsp',
null,
1,
0,
null);
insert into SYS_RESOURCES (RESOURCE_ID, RESOURCE_NAME, RESOURCE_DESC, RESOURCE_TYPE, RESOURCE_STRING, PRIORITY, ENABLED, ISSYS, MODULE)
values (
'node_mgr3',
'node_mgr',
'节点管理',
'url',
'/*/*/Tree.jsp',
null,
1,
0,
null);
insert into SYS_RESOURCES (RESOURCE_ID, RESOURCE_NAME, RESOURCE_DESC, RESOURCE_TYPE, RESOURCE_STRING, PRIORITY, ENABLED, ISSYS, MODULE)
values (
'login4',
'login',
'登录',
'url',
'/login.jsp',
null,
1,
0,
null);
insert into SYS_RESOURCES (RESOURCE_ID, RESOURCE_NAME, RESOURCE_DESC, RESOURCE_TYPE, RESOURCE_STRING, PRIORITY, ENABLED, ISSYS, MODULE)
values (
'index5',
'index',
'登录后欢迎页面',
'url',
'/index.jsp',
null,
1,
0,
null);
insert into SYS_RESOURCES (RESOURCE_ID, RESOURCE_NAME, RESOURCE_DESC, RESOURCE_TYPE, RESOURCE_STRING, PRIORITY, ENABLED, ISSYS, MODULE)
values (
'resources_mgr',
'resources_mgr',
'资源管理',
'action',
'/managerResource',
null,
1,
0,
null);
insert into SYS_RESOURCES (RESOURCE_ID, RESOURCE_NAME, RESOURCE_DESC, RESOURCE_TYPE, RESOURCE_STRING, PRIORITY, ENABLED, ISSYS, MODULE)
values (
'horizontal_qry6',
'horizontal_qry',
'横向查询',
'action',
'/horizontalQuery',
null,
1,
0,
null);
insert into SYS_RESOURCES (RESOURCE_ID, RESOURCE_NAME, RESOURCE_DESC, RESOURCE_TYPE, RESOURCE_STRING, PRIORITY, ENABLED, ISSYS, MODULE)
values (
'vertical_qry7',
'vertical_qry',
'纵向查询',
'action',
'/verticalQuery',
null,
1,
0,
null);
insert into SYS_RESOURCES (RESOURCE_ID, RESOURCE_NAME, RESOURCE_DESC, RESOURCE_TYPE, RESOURCE_STRING, PRIORITY, ENABLED, ISSYS, MODULE)
values (
'dep_mgr1',
'dep_mgr',
'单位管理',
'action',
'/UnitsManager',
null,
1,
0,
null);
insert into SYS_RESOURCES (RESOURCE_ID, RESOURCE_NAME, RESOURCE_DESC, RESOURCE_TYPE, RESOURCE_STRING, PRIORITY, ENABLED, ISSYS, MODULE)
values (
'user_mgr2',
'user_mgr',
'用户管理',
'action',
'/managerUser',
null,
1,
0,
null);
insert into SYS_RESOURCES (RESOURCE_ID, RESOURCE_NAME, RESOURCE_DESC, RESOURCE_TYPE, RESOURCE_STRING, PRIORITY, ENABLED, ISSYS, MODULE)
values (
'authority_mgr',
'authority_mgr',
'权限管理',
'action',
'/managerAuthority',
null,
1,
0,
null);
insert into SYS_RESOURCES (RESOURCE_ID, RESOURCE_NAME, RESOURCE_DESC, RESOURCE_TYPE, RESOURCE_STRING, PRIORITY, ENABLED, ISSYS, MODULE)
values (
'role_mgr',
'role_mgr',
'角色管理',
'action',
'/managerRole',
null,
null,
null,
null);
commit;

prompt
12 records loaded

prompt Loading SYS_AUTHORITIES_RESOURCES
insert into SYS_AUTHORITIES_RESOURCES (ID, AUTHORITY_ID, RESOURCE_ID, ENABLED)
values (
1,
'AUTH_AFTERLOGINWELCOME5',
'index5',
1);
insert into SYS_AUTHORITIES_RESOURCES (ID, AUTHORITY_ID, RESOURCE_ID, ENABLED)
values (
2,
'AUTH_LOGIN4',
'login4',
1);
insert into SYS_AUTHORITIES_RESOURCES (ID, AUTHORITY_ID, RESOURCE_ID, ENABLED)
values (
3,
'AUTH_NODE_MGR3',
'node_mgr3',
1);
insert into SYS_AUTHORITIES_RESOURCES (ID, AUTHORITY_ID, RESOURCE_ID, ENABLED)
values (
4,
'AUTH_XTSZ_DEPT1',
'dep_mgr1',
1);
insert into SYS_AUTHORITIES_RESOURCES (ID, AUTHORITY_ID, RESOURCE_ID, ENABLED)
values (
5,
'AUTH_XTSZ_USER2',
'user_mgr2',
1);
insert into SYS_AUTHORITIES_RESOURCES (ID, AUTHORITY_ID, RESOURCE_ID, ENABLED)
values (
7,
'AUTH_XTSZ_USER2',
'horizontal_qry6',
1);
insert into SYS_AUTHORITIES_RESOURCES (ID, AUTHORITY_ID, RESOURCE_ID, ENABLED)
values (
8,
'AUTH_XTSZ_DEPT1',
'vertical_qry7',
1);
insert into SYS_AUTHORITIES_RESOURCES (ID, AUTHORITY_ID, RESOURCE_ID, ENABLED)
values (
12,
'AUTH_XTSZ_USER2',
'role_mgr',
1);
insert into SYS_AUTHORITIES_RESOURCES (ID, AUTHORITY_ID, RESOURCE_ID, ENABLED)
values (
10,
'AUTH_XTSZ_USER2',
'resources_mgr',
1);
insert into SYS_AUTHORITIES_RESOURCES (ID, AUTHORITY_ID, RESOURCE_ID, ENABLED)
values (
11,
'AUTH_XTSZ_USER2',
'authority_mgr',
1);
commit;

prompt
10 records loaded

prompt Loading SYS_ROLES
insert into SYS_ROLES (ROLE_ID, ROLE_NAME, ROLE_DESC, ENABLED, ISSYS, MODULE)
values (
'1303463518765',
'ROLE_dd1',
'dd1',
1,
0,
'01');
insert into SYS_ROLES (ROLE_ID, ROLE_NAME, ROLE_DESC, ENABLED, ISSYS, MODULE)
values (
'1303463949640',
'ROLE_rr1',
'rr1',
1,
0,
'02');
insert into SYS_ROLES (ROLE_ID, ROLE_NAME, ROLE_DESC, ENABLED, ISSYS, MODULE)
values (
'ROLE_PLATFORMADMIN1',
'ROLE_PLATFORMADMIN',
'可管理整个平台的用户、单位设置。',
1,
1,
'01');
insert into SYS_ROLES (ROLE_ID, ROLE_NAME, ROLE_DESC, ENABLED, ISSYS, MODULE)
values (
'ROLE_USER2',
'ROLE_USER',
'普通用户',
1,
0,
'01');
insert into SYS_ROLES (ROLE_ID, ROLE_NAME, ROLE_DESC, ENABLED, ISSYS, MODULE)
values (
'ROLE_LOGINTOWELCOME4',
'ROLE_LOGINTOWELCOME',
'仅登录到欢迎界面!',
1,
0,
'01');
insert into SYS_ROLES (ROLE_ID, ROLE_NAME, ROLE_DESC, ENABLED, ISSYS, MODULE)
values (
'ROLE_SYSADMIN3',
'ROLE_SYSADMIN',
'可管理本系统的用户、单位设置。',
1,
0,
'01');
insert into SYS_ROLES (ROLE_ID, ROLE_NAME, ROLE_DESC, ENABLED, ISSYS, MODULE)
values (
'ROLE_WORK',
'ROLE_WORK',
'作业子系统的角色(试验)',
1,
0,
'02');
insert into SYS_ROLES (ROLE_ID, ROLE_NAME, ROLE_DESC, ENABLED, ISSYS, MODULE)
values (
'ROLE_LOGIN',
'ROLE_LOGIN',
'系统登录',
1,
0,
'01');
commit;

prompt
8 records loaded

prompt Loading SYS_ROLES_AUTHORITIES
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
1,
'ROLE_LOGINTOWELCOME4',
'AUTH_AFTERLOGINWELCOME5',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
2,
'ROLE_PLATFORMADMIN1',
'AUTH_AFTERLOGINWELCOME5',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
3,
'ROLE_PLATFORMADMIN1',
'AUTH_LOGIN4',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
4,
'ROLE_PLATFORMADMIN1',
'AUTH_NODE_MGR3',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
5,
'ROLE_PLATFORMADMIN1',
'AUTH_XTSZ_DEPT1',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
6,
'ROLE_PLATFORMADMIN1',
'AUTH_XTSZ_USER2',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
7,
'ROLE_SYSADMIN3',
'AUTH_XTSZ_DEPT1',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
8,
'ROLE_SYSADMIN3',
'AUTH_XTSZ_USER2',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
9,
'ROLE_USER2',
'AUTH_LOGIN4',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
10,
'ROLE_LOGINTOWELCOME4',
'AUTH_LOGIN4',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
11,
'ROLE_USER2',
'AUTH_AFTERLOGINWELCOME5',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
1303463962718,
'1303463949640',
'AUTH_LOGIN4',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
1303463972234,
'ROLE_WORK',
'AUTH_LOGIN4',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
1303463972235,
'ROLE_WORK',
'AUTH_AFTERLOGINWELCOME5',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
1303463972250,
'ROLE_WORK',
'AUTH_XTSZ_DEPT1',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
1303463972251,
'ROLE_WORK',
'AUTH_XTSZ_USER2',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
1303463972265,
'ROLE_WORK',
'AUTH_NODE_MGR3',
1);
insert into SYS_ROLES_AUTHORITIES (ID, ROLE_ID, AUTHORITY_ID, ENABLED)
values (
1303287600015,
'ROLE_LOGIN',
'AUTH_LOGIN4',
1);
commit;

prompt
18 records loaded

prompt Loading SYS_USERS
insert into SYS_USERS (
USER_ID, USER_ACCOUNT,
USER_NAME, USER_PASSWORD, USER_DESC, ENABLED, ISSYS, USER_DEPT, USER_DUTY, SUB_SYSTEM)
values (
'1304494573750',
'lxb',
'lxb',
'c7d3f4c857bc8c145d6e5d40c1bf23d9',
null,
1,
0,
'10011001',
null,
'01');
insert into SYS_USERS (
USER_ID, USER_ACCOUNT,
USER_NAME, USER_PASSWORD, USER_DESC, ENABLED, ISSYS, USER_DEPT, USER_DUTY, SUB_SYSTEM)
values (
'1304490737406',
'lxb',
'lxb',
'c7d3f4c857bc8c145d6e5d40c1bf23d9',
null,
1,
0,
'10011001',
null,
'01');
insert into SYS_USERS (
USER_ID, USER_ACCOUNT,
USER_NAME, USER_PASSWORD, USER_DESC, ENABLED, ISSYS, USER_DEPT, USER_DUTY, SUB_SYSTEM)
values (
'1304574079546',
'ddd',
'ddd',
'0a4f6a961276619f7f91356bcba5a746',
null,
0,
0,
null,
null,
'01');
insert into SYS_USERS (
USER_ID, USER_ACCOUNT,
USER_NAME, USER_PASSWORD, USER_DESC, ENABLED, ISSYS, USER_DEPT, USER_DUTY, SUB_SYSTEM)
values (
'1304573363921',
'lxb',
'卢小兵',
'09eb37d219cfa835db40e5ab587f7082',
'普通仅登录到欢迎界面!',
0,
0,
'1001',
null,
'01');
insert into SYS_USERS (
USER_ID, USER_ACCOUNT,
USER_NAME, USER_PASSWORD, USER_DESC, ENABLED, ISSYS, USER_DEPT, USER_DUTY, SUB_SYSTEM)
values (
'1304573484515',
'lll',
'lll',
'47acedc22cef8c3762c21a435e262d67',
null,
1,
0,
'1001',
null,
'01');
insert into SYS_USERS (
USER_ID, USER_ACCOUNT,
USER_NAME, USER_PASSWORD, USER_DESC, ENABLED, ISSYS, USER_DEPT, USER_DUTY, SUB_SYSTEM)
values (
'admin1',
'admin',
'系统管理员',
'ceb4f32325eda6142bd65215f4c0f371',
'超级系统管理员',
1,
1,
'1001',
null,
'01');
insert into SYS_USERS (
USER_ID, USER_ACCOUNT,
USER_NAME, USER_PASSWORD, USER_DESC, ENABLED, ISSYS, USER_DEPT, USER_DUTY, SUB_SYSTEM)
values (
'user2',
'user',
'普通用户',
'47a733d60998c719cf3526ae7d106d13',
'普通用户',
1,
0,
'1001',
null,
'01');
insert into SYS_USERS (
USER_ID, USER_ACCOUNT,
USER_NAME, USER_PASSWORD, USER_DESC, ENABLED, ISSYS, USER_DEPT, USER_DUTY, SUB_SYSTEM)
values (
'sysUser3',
'sysUser',
'系统设置维护',
'8f0295328c34f8eedc2362e9f4a10b7e',
'系统设置用户',
1,
0,
'1001',
null,
'01');
insert into SYS_USERS (
USER_ID, USER_ACCOUNT,
USER_NAME, USER_PASSWORD, USER_DESC, ENABLED, ISSYS, USER_DEPT, USER_DUTY, SUB_SYSTEM)
values (
'lxb4',
'lxb',
'卢小兵',
'c7d3f4c857bc8c145d6e5d40c1bf23d9',
'普通仅登录到欢迎界面!',
1,
0,
'1001',
null,
'01');
insert into SYS_USERS (
USER_ID, USER_ACCOUNT,
USER_NAME, USER_PASSWORD, USER_DESC, ENABLED, ISSYS, USER_DEPT, USER_DUTY, SUB_SYSTEM)
values (
'1304566319625',
'lxb5',
'lx5',
'1abe40ed6d0da1c834586e8ecef61fe7',
null,
0,
0,
'10011001',
null,
'01');
commit;

prompt
10 records loaded

prompt Loading SYS_USERS_ROLES
insert into SYS_USERS_ROLES (ID,
USER_ID, ROLE_ID, ENABLED)
values (
1,
'admin1',
'ROLE_PLATFORMADMIN1',
1);
insert into SYS_USERS_ROLES (ID,
USER_ID, ROLE_ID, ENABLED)
values (
2,
'sysUser3',
'ROLE_SYSADMIN3',
1);
insert into SYS_USERS_ROLES (ID,
USER_ID, ROLE_ID, ENABLED)
values (
3,
'user2',
'ROLE_USER2',
1);
insert into SYS_USERS_ROLES (ID,
USER_ID, ROLE_ID, ENABLED)
values (
4,
'lxb4',
'ROLE_LOGINTOWELCOME4',
1);
insert into SYS_USERS_ROLES (ID,
USER_ID, ROLE_ID, ENABLED)
values (
5,
'1304573484515',
'1303463518765',
null);
commit;

prompt
5 records loaded

prompt Enabling
foreign key constraints
for SYS_AUTHORITIES_RESOURCES
alter table SYS_AUTHORITIES_RESOURCES enable
constraint FK_PUB_AUTHORITIES_RE_AU;
alter table SYS_AUTHORITIES_RESOURCES enable
constraint FK_PUB_AUTHORITIES_RE_RE;

prompt Enabling
foreign key constraints
for SYS_ROLES_AUTHORITIES
alter table SYS_ROLES_AUTHORITIES enable
constraint FK_PUB_ROLES_AUTHORITIES_AU;
alter table SYS_ROLES_AUTHORITIES enable
constraint FK_PUB_ROLES_AUTHORITIES_ROLES;

prompt Enabling
foreign key constraints
for SYS_USERS_ROLES
alter table SYS_USERS_ROLES enable
constraint FK_USERS_ROLES_ROLES;
alter table SYS_USERS_ROLES enable
constraint FK_USERS_ROLES_USERS;

prompt Enabling triggers
for SYS_AUTHORITIES
alter table SYS_AUTHORITIES enable
all triggers;

prompt Enabling triggers
for SYS_RESOURCES
alter table SYS_RESOURCES enable
all triggers;

prompt Enabling triggers
for SYS_AUTHORITIES_RESOURCES
alter table SYS_AUTHORITIES_RESOURCES enable
all triggers;

prompt Enabling triggers
for SYS_ROLES
alter table SYS_ROLES enable
all triggers;

prompt Enabling triggers
for SYS_ROLES_AUTHORITIES
alter table SYS_ROLES_AUTHORITIES enable
all triggers;

prompt Enabling triggers
for SYS_USERS
alter table SYS_USERS enable
all triggers;

prompt Enabling triggers
for SYS_USERS_ROLES
alter table SYS_USERS_ROLES enable
all triggers;
set feedback
on
set define
on

prompt Done.
为了叙述的严谨性,这里说的是Spring Security3.0.2,而非其他版本,这是因为我只读过Spring Security3.0.2的代码,并且在该版本上面扩展自定义的
动态管理用户、角色、权限和资源成功。 估计其他版本的验证和授权方法是差不太多的,因为没有接触过,也不敢大胆猜测。
3、当用户登录时,AuthenticationManager进行响应,通过用户输入的用户名和密码,然后再根据用户定义的密码算法和盐值等进行计算并和数据库比对,
当正确时通过验证。此时MyUserDetailsService进行响应,根据用户名从数据库中提取该用户的权限列表,组合成UserDetails供Spring Security使用。
那好,我们在MyAccessDecisionManager类的decide这个方法里,将通过URL取得的权限列表进行循环,然后跟第3步中登录的用户所具有的权限进行比对,若相同,则表明该用户具有访问该资源的权利。 不大明白吧? 简单地说, 在数据库中我们定义了访问“LOGIN”这个URL必须是具有ROLE_ADMIN权限的人来访问,那么,登录用户恰恰具有该ROLE_ADMIN权限,两者的比对过程中,就能够返回TRUE,可以允许该用户进行访问。就这么简单!
不过在第2步的时候,一定要注意,MyInvocationSecurityMetadataSoruceService类的loadResourceDefine()方法中,形成以URL为key,权限列表为value的Map时,
要注意key和Value的对应性,避免Value的不正确对应形成重复,这样会导致没有权限的人也能访问到不该访问到的资源。
还有getAttributes()方法,要有 url.indexOf("?")这样的判断,要通过判断对URL特别是Action问号之前的部分进行匹配,防止用户请求的带参数的URL与你数据库中定义的URL不匹配,造成访问拒绝!
当然,你在设计了7张表之后,那么对于这些之间相互关联的关系内容及信息内容,就得由你来进行维护了,大约有用户、角色、权限、资源的增删改查,并还需要设置用户和角色、角色和权限、权限和资源之间的关系。可考虑分为三个菜单进行维护,用户设置、角色设置、资源设置。 在用户设置里分别管理用户、用户与角色的关系;在角色设置里管理角色、角色与权限的关系; 在资源设置里分别管理权限、权限与资源的关系等。
本来准备是直接从源码修改来的, 但是始终认为修改源码并非终极解决之道,有违OO的精神本质,再者由于时间关系,只是对代码进行了研究,但并没有进行实现或验证。只待以后时间稍稍宽松时再做为兴趣进行研究,在次不过多的讲解。但据我从代码上来看,一是将从配置文件中获取用户及权限的功能修改为从数据库中提取出来;二是将从配置文件中获取权限和资源的对应关系修改为从数据库中提取;三是修改User增加相关信息等。
始终还是围绕着JdbcDaoImpl和DefaultFilterInvocationSecurityMetadataSource还有User这3个类进行修改。
以实现从数据库提取用户、角色、权限和资源信息。
不可否认,Spring Security依赖于Spring的Ioc、AOP等机制,横切开系统的业务组件,将通用的权限功能注入到业务组件内部,实现了通用功能和业务功能的无缝整合,但又保证了通用功能和业务功能的实现上的分离,省却了一部分工作量,这是其存在的最重要意义。
但又不可否认,Spring Security所具有的缺乏动态资源管理的硬伤(若是能够提供用户、角色、权限和资源的数据库管理,并且提供管理界面那实在是太完美了,可惜这两样一样都不能实现),又令国人用户爱恨交加。