首页 > 代码库 > 跟我学习Spring Security--在线宠物商店开发(六)

跟我学习Spring Security--在线宠物商店开发(六)

  前面几节都是将用户以及权限都配置在配置文件,在企业中,这种方法是不可取的,因此,我们今天来将用户信息以及权限信息移到数据库。

 为了从数据库中获取用户权限信息,我们所需要的仅仅是修改配置文件中的authentication-provider部分,将文件中的user-service替换为jdbc-user-service,替换内容如下所示:

<authentication-manager alias="authenticationManager">
		<authentication-provider>
			<jdbc-user-service data-source-ref="dataSource"/>
		</authentication-provider>
	</authentication-manager>	

从上面可以看出来需要数据源,现在我们就在Spring的dogstore-base.xml里面添加数据源,典型的配置如下:

<context:property-placeholder  location="/WEB-INF/jdbc.properties"/>
	
<bean  id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
      <property name="driverClassName" value="http://www.mamicode.com/${jdbc.driverClassName}"/>  
      <property name="url" value="http://www.mamicode.com/${jdbc.url}"/>  
      <property name="username" value="http://www.mamicode.com/${jdbc.username}"/>  
      <property name="password" value="http://www.mamicode.com/${jdbc.password}"/>  
</bean>

jdbc.properties:

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl 
jdbc.username=project
jdbc.password=project

注意添加BasicDataSource数据源的三个jar以及jdbc所以jar。

Spring Security默认情况下需要两张表,用户表和权限表。以下是oracle中的建表语句:

create table users(
    username varchar(50) not null primary key,
    password varchar(50) not null,
    enabled char(2)
);

create table authorities (
    username varchar(50) not null,
    authority varchar(50) not null
);

Spring Security会在初始化时,从这两张表中获得用户信息和对应权限,将这些信息保存到缓存中。其中users表中的登录名和密码用来控制用户的登录,而权限表中的信息用来控制用户登陆后是否有权限访问受保护的系统资源。

insert into users(username,password,enabled) values(‘admin‘,‘admin‘,1);
insert into users(username,password,enabled) values(‘user‘,‘user‘,1);

insert into authorities(username,authority) values(‘admin‘,‘ROLE_ADMIN‘);
insert into authorities(username,authority) values(‘admin‘,‘ROLE_USER‘);
insert into authorities(username,authority) values(‘user‘,‘ROLE_USER‘);

注意将前一章节做的ipTokenBasedRememberMeServicesBean这个注释掉,因为没有提供userService。


其实在企业中,上面两张表关于权限控制过于简单,因此很多企业都是自己设计满足自身业务的表单以及自身对应的权限控制体系,那我们怎么让Spring Security来运行在自身设计的权限控制上呢?

普遍的企业做法是,用户表、角色表、角色用户关联表这三张表来设计权限控制,我们下面也是基于这种思想来设计:

-- 角色
create table role(
    id number(11),
    name varchar(50),
    descn varchar(200)
);

-- 用户
create table USERS(
    id number(11),
    username varchar(50),
    password varchar(50),
    status number(11),
    descn varchar(200)
);


-- 用户角色连接表
create table user_role(
    user_id number(11),
    role_id number(11)
);
--添加主键、外键
alter table role add constraint pk_role primary key(id);
 
  alter table "USER" add constraint pk_user primary key(id);
  
  ALTER TABLE user_role ADD CONSTRAINT FK_user_id FOREIGN KEY(user_id) REFERENCES "USER"(id);
  
  ALTER TABLE user_role add constraint fk_role_id foreign key(role_id) references role(id);
  
 --添加数据
insert into USERS(id,username,password,status,descn) values(1,‘admin‘,‘admin‘,1,‘管理员‘);
insert into USERS(id,username,password,status,descn) values(2,‘user‘,‘user‘,1,‘用户‘);

insert into role(id,name,descn) values(1,‘ROLE_ADMIN‘,‘管理员角色‘);
insert into role(id,name,descn) values(2,‘ROLE_USER‘,‘用户角色‘);

insert into user_role(user_id,role_id) values(1,1);
insert into user_role(user_id,role_id) values(1,2);
insert into user_role(user_id,role_id) values(2,2);

现在我们要在这样的数据结构基础上使用Spring Security,Spring Security所需要的数据只是为了处理两种情况,一是判断登录用户是否合法,二是判断登陆的用户是否有权限访问受保护的系统资源。

我们所要做的工作就是在现有数据结构的基础上,为Spring Security提供这两种数据:

处理用户登陆

select username,password,status as enabled
  from user
 where username=?

检验用户权限

select u.username,r.name as authority
  from user u
  join user_role ur
    on u.id=ur.user_id
  join role r
    on r.id=ur.role_id
 where u.username=?

现在我们修改一下配置文件:

 <authentication-provider>
        <jdbc-user-service data-source-ref="dataSource"            
        users-by-username-query="select username,password,status as enabled
                                         from user
                                        where username=?"            
        authorities-by-username-query="select u.username,r.name as authority
                                             from user u
                                             join user_role ur
                                              on u.id=ur.user_id
                                             join role r
                                               on r.id=ur.role_id
                                            where u.username=?"/>
    </authentication-provider>

users-by-username-query为根据用户名查找用户,系统通过传入的用户名查询当前用户的登录名,密码和是否被禁用这一状态。


authorities-by-username-query为根据用户名查找权限,系统通过传入的用户名查询当前用户已被授予的所有权限。


本文出自 “进击的程序猿” 博客,请务必保留此出处http://zangyanan.blog.51cto.com/11610700/1877212

跟我学习Spring Security--在线宠物商店开发(六)