跟我学习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="${jdbc.driverClassName}"/>  
      <property name="url" value="${jdbc.url}"/>  
      <property name="username" value="${jdbc.username}"/>  
      <property name="password" value="${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为根据用户名查找权限,系统通过传入的用户名查询当前用户已被授予的所有权限。

时间: 2024-12-25 22:21:05

跟我学习Spring Security--在线宠物商店开发(六)的相关文章

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

本应用遵循标准的三层结构,包括web层.服务层和数据访问层,如下图所示: web层封装了MVC的代码和功能.在示例代码中,我们使用了Spring MVC框架,但是我们可以一样容易的使用Spring Web Flow,Struts甚至是一个对Spring友好的web stack如Apache Wicket. 在一个典型使用Spring Security的web应用中,大量配置和参数代码位于web层.所以,如果你没有web应用开发,尤其是Spring MVC的经验,在我们进入更复杂的话题前,你最好仔

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

前面我们用了简单的三步就完成了一个Spring- Secutiry的搭建,主要是通过添加auto-config属性和http元素实现的,但是在实际工作中要比这个复杂的太多,现在我们按部就班的来完善我们的权限管理,遇到理论问题,可以去查看专家博客:http://lengyun3566.iteye.com/blog关于Spring Secutiry3翻译. 现在我们为我们JBCP Pets在线商店完善一下,我们先配置自己默认的登录界面,有兴趣的可以从网上找一个,这里我不用书上的登录界面,我从网上找的

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

我们首先来一个简单Spring Security登录,首先需要搭建环境,这里我们用Spring+SpringMVC+Spring Security,数据库用Hibernate4+Oracle,关于jar包,Spring以及SpringMVC我用的是3.2版本的. 在web.xml中我们主要是配置Spring.SpringMVC以及Spring Security的集成. <?xml version="1.0" encoding="UTF-8"?> <

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

我们知道将信息存在cookie中会存在一定的被拦截并被重用使用的风险,如图所示: 有一种让remember me功能更安全的方式就是将用户的IP地址绑定到cookie的内容上.让我们通过一个例子来描述怎样构建RememberMeServices的实现类来完成这个功能. 基本的实现方式是扩展o.s.s.web.authentication.rememberme.TokenBasedRememberMeServices基类,以添加请求者的IP地址到cookie本身和其他的MD5哈希元素中. 扩展这个

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

现在我们来用Spring Security检测一下登录功能,添加在views下添加一个main.jsp <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 

Spring Security和Apache Shiro开发企业级权限管理系统

原理回顾什么是权限管理?权限管理是系统的安全范畴,要求必须是合法的用户才可以访问系统(用户认证),且必须具有该 资源的访问权限才可以访问该 资源(授权).认证:对用户合法身份的校验,要求必须是合法的用户才可以访问系统.授权:访问控制,必须具有该 资源的访问权限才可以访问该 资源.权限模型:标准权限数据模型包括 :用户.角色.权限(包括资源和权限).用户角色关系.角色权限关系.权限分配:通过UI界面方便给用户分配权限,对上边权限模型进行增.删.改.查操作.权限控制:基于角色的权限控制:根据角色判断

[转]Spring Security学习总结二

原文链接: http://www.blogjava.net/redhatlinux/archive/2008/08/20/223148.html http://www.blogjava.net/redhatlinux/archive/2008/09/01/226010.html [总结-含源码]Spring Security学习总结二 Posted on 2008-09-01 10:08 tangtb 阅读(9518) 评论(12)  编辑  收藏 所属分类: Spring .Spring Se

Spring Security学习总结

1.Spring Security介绍  一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分. 用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统.用户认证一般要求用户提供用户名和密码.系统通过校验用户名和密码来完成认证过程. 用户授权指的是验证某个用户是否有权限执行某个操作.在一个系统中,不同用户所具有的权限是不同的.比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改.一般来说,系统

spring security oauth2 jwt 认证和资源分离的配置文件(java类配置版)

最近再学习spring security oauth2.下载了官方的例子sparklr2和tonr2进行学习.但是例子里包含的东西太多,不知道最简单最主要的配置有哪些.所以决定自己尝试搭建简单版本的例子.学习的过程中搭建了认证和资源在一个工程的例子,将token存储在数据库的例子等等 .最后做了这个认证和资源分离的jwt tokens版本.网上找了一些可用的代码然后做了一个整理, 同时测试了哪些代码是必须的.可能仍有一些不必要的代码在,欢迎大家赐教. 一.创建三个spring boot 工程,分