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

本应用遵循标准的三层结构,包括web层、服务层和数据访问层,如下图所示:

web层封装了MVC的代码和功能。在示例代码中,我们使用了Spring MVC框架,但是我们可以一样容易的使用Spring Web Flow,Struts甚至是一个对Spring友好的web stack如Apache Wicket。

在一个典型使用Spring Security的web应用中,大量配置和参数代码位于web层。所以,如果你没有web应用开发,尤其是Spring MVC的经验,在我们进入更复杂的话题前,你最好仔细看一下基础代码并确保你能理解。再次强调,我们已经尽力让我们的应用简单,把它构建成一个pet store只是为了给它一个合理的名字和轻量级的结构。可以将其与复杂的Java EE Pet Clinic示例作为对比,那个示例代码展现了很多技术的使用指导。

服务层封装了应用的业务逻辑。在示例应用中,我们在数据访问层前做了一个很薄的faade用来描述如何在特殊的点周围保护应用的服务方法。

在典型的web工程中,这一层将会包括业务规则校验,组装和分解BO以及交叉的关注点如审计等。

数据访问层封装了操作数据库表的代码。在很多基于Spring的工程中,这将会在这里发现使用了ORM技术如hibernate或JPA。它为服务层暴露了基于对象的API。在示例代码中,我们使用基本的JDBC功能完成到内存数据库HSQL的持久化。

在典型的web工程中,将会使用更为复杂的数据访问方式。因为ORM,即数据访问,开发人员对其很迷惑。所以为了更清晰,这一部分我们尽可能的对其进行了简化。

为了Spring Security的使用更高效,在开始评估和提高我们应用的安全状况之前,先了解一些关键的概念和术语是很重要的。

认证

正如我们在第一章所讨论的那样,认证是鉴别我们应用中的用户是他们所声明的那个人。你可能在在线或线下的日常生活中,遇到不同场景的认证:

  • 凭据为基础的认证:当你登录e-mail账号时,你可能提供你的用户名和密码。E-mail的提供商会将你的用户名与数据中的记录进行匹配,并验证你提供的密码与对应的记录是不是匹配。这些凭证(用户名和密码,译者注)就是e-mail系统用来鉴别你是一个合法用户的。首先,我们将首先使用这种类型的认证来保护我们JBCP Pet在线商店的敏感区域。技术上来说,e-mail系统能够检查凭证信息不一定非要使用数据库而是各种方式,如一个企业级的目录服务器如Microsoft Active Directory。一些这种类型的集成方式将在本书的第二部分讲解。
  • 两要素认证:当你想从自动柜员机取钱的时候,你在被允许取钱和做其他业务前,你必须先插卡并输入你的密码。这种方式的认证与用户名和密码的认证方式很类似,与之不同的是用户名信息被编码到卡的磁条上了。联合使用物理磁卡和用户输入密码能是银行确认你可能有使用这个账号的权限。联合使用密码和物理设备(你的ATM卡)是一种普遍存在的两要素认证形式。专业来看,在安全领域,这种类型的设备在安全性要求高的系统中很常见,尤其是处理财务或个人识别信息时。硬件设备如RSA的SecurId联合使用了基于时间的硬件和服务端的认证软件,使得这样的环境极难被破坏。
  • 硬件认证:早上当你启动汽车时,你插入钥匙并打火。尽管和其他的两个例子很类似,但是你的钥匙和打火装置的匹配是一种硬件认证的方式。

其实会有很多种的认证方式来解决硬件和软件的安全问题,它们各自也有其优缺点。我们将会在本书的后面章节中介绍它们中的一些,因为它们适用于Spring Security。事实上,本书的后半部分基本上都是原来介绍很多通用的认证方式用Spring Security的实现。

Spring Security扩展了java标准概念中的已认证安全实体(对应单词principal)(java.security.Principal),它被用来唯一标识一个认证过的实体。尽管一个典型的安全实体通常一对一的指向了系统中的一个用户,但它也可能对应系统的各种客户端,如web service的客户端、自动运行的feed聚合器(automated batch feed)等等。在大多数场景下,在你使用Spring Security的过程中,一个安全实体(Principal)只是简单地代表一个用户(user),所以我当我们说一个安全实体的时候,你可以将其等同于说用户。

授权

授权通常涉及到两个不同的方面,他们共同描述对安全系统的可访问性。

第一个是已经认证的安全实体与一个或多个权限(authorities)的匹配关系(通常称为角色)。例如,一

个非正式的用户访问你的网站将被视为只有访问的权限而一个网站的管理员将会被分配管理的权限。

第二个是分配权限检查给系统中要进行安全保护的资源。通常这将会在系统的开发过程中进行,有可能会

通过代码进行明确的声明也可能通过参数进行设置。例如,在我们应用中管理宠物商店详细目录的界面只能对

具有管理权限的用户开放。

【要进行安全保护的资源可以是系统的任何内容,它们会根据用户的权限进行有选择的可访问控制。web

应用中的受保护资源可以是单个的页面、网站的一个完整部分或者一部分界面。相反的,受保护的业务资源可

能会是业务对象的一个方法调用或者单个的业务对象。】

你可能想象的出对一个安全实体的权限检查过程,查找它的用户账号并确定它是不是真的为一个管理员。如

果权限检查确定这个试图访问受保护区区域的安全实体实际上是管理员,那么这个请求将会成功,否则,这个

安全实体的请求将会因为它缺少足够的权限而被拒绝。

我们更近距离的看一个特定的受保护资源——产品目录的编辑界面。目录的编辑界面需要管理员才能访问

(毕竟,我们不希望普通的用户能够调整我们的目录层次),因此当一个安全实体访问它的时候会要求特定等

级的权限。

当我们思考一个网站的管理员试图访问受保护的资源时,权限控制决定是如何做出的时候,我们猜想对受保

护资源的权限的检查过程可以用集合理论很简明的进行表述。我们将会使用维恩图来展现对管理用户的这个决

策过程:

对这个页面来说,在用户权限(普通用户和管理员)和需要权限(管理员)之间有一个交集,所以在交集中的用户将能够进行访问。

可以与没有授权的访问者进行对比:

权限集合没有交集,没有公共的元素。所以,用户将会被拒绝访问这个界面。至此,我们已经介绍了对资源授权的简单原理。

实际上,会有真正的代码来决定用户是允许还是被拒绝访问受保护的资源。下面的图片在整体上描述了这个过程,正如Spring Security所使用的那样:

        我们可以看到,有一个名为访问决策管理器(access decision manager)的组件来负责决定一个安全实体是不是有适当的访问权限,判断基于安全实体具备的权限与被请求资源所要求资源的匹配情况。

安全访问控制器对访问是否被允许的判断过程可能会很简单,就像查看安全实体所拥有的权限集合与被访问资源所要求的资源集合是不是有交集。

以上文章来自网络关于Spring Security3翻译。

时间: 2024-10-24 16:19:35

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

跟我学习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--在线宠物商店开发(六)

前面几节都是将用户以及权限都配置在配置文件,在企业中,这种方法是不可取的,因此,我们今天来将用户信息以及权限信息移到数据库. 为了从数据库中获取用户权限信息,我们所需要的仅仅是修改配置文件中的authentication-provider部分,将文件中的user-service替换为jdbc-user-service,替换内容如下所示: <authentication-manager alias="authenticationManager"> <authentica

跟我学习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 工程,分