`
lengyun3566
  • 浏览: 445900 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
D59180b9-02f1-3380-840c-ea34da46143c
《Spring Secur...
浏览量:378646
社区版块
存档分类
最新评论

《Spring Security3》第三章第一部分翻译

阅读更多

第三章   增强用户体验

在本章中,我们将对JBCP Pets在线商店增加一些功能,这些新功能能够为用户提供更愉悦和可用的用户体验,同时提供一些对安全系统很重要的功能。

在本章中,我们将要:

l  按照你的意愿自定义登录和退出页面,并将它们与标准的Spring web MVC的控制器相关联;

l  使用remember me功能为用户提供便利,并理解其背后的安全含义;

l  构建用户账号管理功能,包括修改密码以及密码遗忘找回功能。

自定义登录页

你可能还记得在前一章中,我们使用了Spring Securitysecurity命名空间的基本配置功能。这为我们提供了基本的登录、认证和授权功能,但是这肯定没有到达产品质量的要求。在我们向老板汇报进度前,要添加的一个很重要的增强功能就是使得登录界面在展现和行为上与我们在线应用的其他地方保持一致。

回忆一下现在的登录界面大致如下所示:

 

自动配置并没有为我们提供很多其他的功能,如为登录页面添加样式。我们要为站点增加以下的功能:

l  拥有页头、页脚以及与JBCP Pets样式一致的登录页;

l  允许用户退出的链接

l  允许用户修改密码的页面。

登录和退出的流程应该如下图所示:


 

我们将会通过一系列的练习来开发完善这个站点的结构。当开发登录和退出功能时,我们将会讲解所做的内容,所以当我们需要扩展站点的基本功能时,能够对于我们构建的内容有一个清晰的理解。

实现自定义的登录页

首先,我们需要一个集成于我们系统的登录页来替代默认的Spring Security登录页。需要的登录流程如下图所示:



 

实现登录的controller

我们需要添加一个Spring MVC的控制器来实现登录功能,以及以后的退出功能。JBCP Pets站点使用Spring MVC基于注解的机制来实现控制器与站点路径和资源的配置。让我们在包下com.packtpub.springsecurity.web.controller创建一个名为LoginLogoutControllercontroller,并包含以下的内容:

 

// imports omitted

@Controller

public class LoginLogoutController extends BaseController{

  @RequestMapping(method=RequestMethod.GET,value="/login.do")

  public void home() {

  }

}

可以看到,我们添加了一个非常简单的controller,并将其唯一的方法匹配至/login.do这个URL地址。这是我们编写简单的自定义登录页所要做的全部事情,这将替代Spring Security基本配置中为我们添加的登录页。BaseController基类在第二章:Spring Security起步的代码中已经添加,它提供了一个便利的地方我们可以添加应用中所有controller都能用到的方法。

添加登录JSP

/login.do引用将会导致我们在WEB-INF/dogstore-servlet.xml配置的Spring MVC view resolver/WEB-INF/views目录下寻找名为login.jspJSP文件。让我们添加一个包含登录form的简单JSP,它将被Spring Security识别和使用。在第二章中我们已经学到,为了保证接下来的行为能够被正确的执行,登录的form中有两个重要的元素必须要被正确的设置:

l  Form action必须与UsernamePasswordAuthenticationFilter过滤器的action的配置相一致。默认的form actionj_spring_security_check

l  用户名和密码的表单域要与servlet的标准相一致。默认j_usernamej_password是文本域的名字。

我们同时会在这个JSP中包含站点的页头和页脚(本章的示例代码中添加了这部分,但是在本书的内容中没有进行罗列,因为它们在这里并不是阐述的重点所在)。这些完成后,得到一个简单的JSP

 

 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"

pageEncoding="ISO-8859-1"%>

<jsp:include page="common/header.jsp">

  <jsp:param name="pageTitle" value="Login"/>

</jsp:include>

<h1>Please Log In to Your Account</h1>

<p>

  Please use the form below to log in to your account.

</p>

<form action="j_spring_security_check" method="post">

  <label for="j_username">Login</label>:

  <input id="j_username" name="j_username" size="20" maxlength="50"

type="text"/>

  <br />

  <label for="j_password">Password</label>:

  <input id="j_password" name="j_password" size="20" maxlength="50"

type="password"/>

  <br />

  <input type="submit" value="Login"/>

</form>

<jsp:include page="common/footer.jsp"/>

需要注意的是,必须使用post方式的form提交,否则UsernamePasswordAuthenticationFilter会拒绝登录请求。

最后,我们还需要Spring Security的自动配置来引用我们新的登录页面。如果你在此时迫不及待想看一下效果的话,我们实际上只是为应用增加了一个新的工作页面。按照上面的流程并输入以下的地址http://localhost:8080/JBCPPets/login.do,看看发生了什么。

什么?你是否发现你的请求首先被Spring Security拦截了(被重定向到spring_security_login)并且能够看见那个登录的form?这是因为Spring Security依旧指向了DefaultLoginPageGeneratingFilter生成的默认登录页。一旦你通过了这个过滤器生成的默认登录页,你才能够看到新的自定义登录页。最后一步就是要移除默认页并使用我们的登录form作为登录页。

配置Spring Security以使用我们的Spring MVC登录页

按照第一感觉,貌似我们只需要配置Spring Security的配置文件中的<form-login>元素并添加login-page命令,大致如下所示:

 

 

    <http auto-config="true" use-expressions="true">

    <intercept-url pattern="/*" access="hasRole('ROLE_USER')"/>

    <form-login login-page="/login.do" />

  </http>

现在,启动应用并输入首页地址(http://localhost:8080/JBCPPets/home.do)。如果你使用的IE浏览器,你会发现页面根本没有渲染,但是页面的似乎在不停的加载。让我们切换到Mozilla Firefox并访问同样的地址。在Firefox下,你能够看到更多的信息,如下所示:



 

产生这样的问题是因为我们的URL拦截规则:

 

<intercept-url pattern="/*" access="hasRole('ROLE_USER')"/>

这将要求访问所有匹配/*URL(这将匹配应用的所有页面,包括我们新的登录页)都需要拥有ROLE_USER角色。下面的图展现了发生了什么事情:



 

(其实上面发生了反复请求登录页的情况,死循环了——译者注)

我们需要修改认证规则来允许匿名用户能够访问登录页。

【对于所有给定的URL请求,Spring Security按照自顶向下的顺序评估认证规则。第一个匹配URL模式的规则将会被使用。这意味着你的授权规则将要按照最特殊的到最不特殊的规则来进行排列。这在开发复杂的规则集合时将会非常重要,因为开发人员经常会感到迷惑,因为他们有时会搞不清到底哪个规则会生效。记住自顶向下顺序,你将能够很容易地在任何场景下找到正确的对应规则。】

因为我们是要添加一个更特殊的规则,所以我们需要将其添加在列表的顶部。我们最终会得到如下的规则设置:

 

<intercept-url pattern="/login.do" access="permitAll"/>

<intercept-url pattern="/*" access="hasRole('ROLE_USER')"/>

这将能够达到我们想要的效果:允许任何用户访问登录页而限制站点的其他部分只能是认证用户才能访问。到此为止,已经完成了登录功能。让我们看一下要添加退出功能都需要做些什么。

 

  • 大小: 21.7 KB
  • 大小: 37.3 KB
  • 大小: 36.4 KB
  • 大小: 43.7 KB
  • 大小: 55.1 KB
9
5
分享到:
评论
11 楼 wzglovejava 2014-12-30  
最近在研究这方面的东西,受教了楼主,非常感谢,不过我想请问,源码怎么下载呢,http://www.packtpub.com/support?nid=4435 这个链接里面没有呢。
10 楼 buxin_2008 2013-06-25  
这也太不全了,缺少很多东西的配置,自己加了很多配置项也不能正常运行。  
9 楼 jobar 2013-02-22  
lijingzhi 写道
header.jsp源代码有点问题,运行会报500错误
<strong><sec:authentication property="principal.username"/></strong>

需要先判断一下是不是已经认证了,如果认证了才显示已认证的username
<strong>
    <sec:authorize access="isAuthenticated()">
        <sec:authentication property="principal.username"/>
    </sec:authorize>
</strong>


这个在章节末尾的时候才添加进来的,现在可以暂时注释掉
8 楼 jobar 2013-02-22  
按照最特殊的到最不特殊的规则来进行排列

应该翻译为:按照最具体的规则到最模糊的规则来进行排序,也就是说优先匹配最具体的规则。
7 楼 lijingzhi 2012-01-04  
header.jsp源代码有点问题,运行会报500错误
<strong><sec:authentication property="principal.username"/></strong>

需要先判断一下是不是已经认证了,如果认证了才显示已认证的username
<strong>
    <sec:authorize access="isAuthenticated()">
        <sec:authentication property="principal.username"/>
    </sec:authorize>
</strong>
6 楼 lengyun3566 2011-09-26  
freeboat 写道
请问 BaseController 第二章已经添加? 为什么没找到呢?

你可以到以下地址http://www.packtpub.com/support?nid=4435下载完整的源代码,因为压缩包比较大,不好直接传上来
5 楼 lengyun3566 2011-09-26  
freeboat 写道
请问 BaseController 第二章已经添加? 为什么没找到呢?

多谢您的关注。这个类开始是没有任何方法的,仅仅是一个基类,书上没有写,随着后续章节不断扩展,到第五章结束时的源码为:
package com.packtpub.springsecurity.web.controller;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.ModelAttribute;

public class BaseController {

/**
* Gets the current request's {@link Authentication} information and returns it.

* @return Authentication for current request
*/
protected Authentication getAuthentication() {
return SecurityContextHolder.getContext().getAuthentication();
}

@ModelAttribute("showLoginLink")
public boolean getShowLoginLink() {
for (GrantedAuthority authority : getAuthentication().getAuthorities()) {
if(authority.getAuthority().equals("ROLE_USER")) {
return false;
}
}
return true;
}
}
4 楼 freeboat 2011-09-26  
请问 BaseController 第二章已经添加? 为什么没找到呢?
3 楼 hoar 2011-07-05  
不错,lz辛苦
2 楼 lengyun3566 2011-06-30  
stevensinclair 写道
捧场了


多谢多谢,继续努力
1 楼 stevensinclair 2011-06-30  
捧场了

相关推荐

    springSecurity3中文文档

    第二章:springsecurity起步 第三章:增强用户体验 第四章:凭证安全存储 第五章:精确的访问控制 第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用...

    spring-security3.2.5

    在身份验证层面,Spring Security广泛支持各种身份验证模式,这些验证模型绝大多数都由第三方提供,或则正在开发的有关标准机构提供的,例如 Internet Engineering Task Force.作为补充,Spring Security 也提供了...

    spring security 参考手册中文版

    第一部分前言 15 1.入门 16 2.介绍 17 2.1什么是Spring Security? 17 2.2历史 19 2.3版本编号 20 2.4获得Spring安全 21 2.4.1使用Maven 21 Maven仓库 21 Spring框架 22 2.4.2 Gradle 23 Gradle存储库 23 使用Spring...

    spring security3.2.0

    在身份验证层面,Spring Security广泛支持各种身份验证模式,这些验证模型绝大多数都由第三方提供,或则正在开发的有关标准机构提供的,例如 Internet Engineering Task Force.作为补充,Spring Security 也提供了...

    [Chapter1-3]Spring Security开发安全的REST服务视频教程

    百度网盘,[Chapter1-3]Spring Security开发安全的REST服务视频教程,第1-3章,无加密

    Spring攻略PDF版

    因为上传大小的限制,分为两部分上传,这是第二部分,第一部分会在评论中给出链接 绝对是spring攻略中文版第二版 Spring专家力作 理论与实践完美结合 问题描述→解决方案→实现方法 第一部分 核心概念  第1章 ...

    Spring Security3.0.1.RELEASE中文手册

    这些验证模型绝大多数都由第三方提供,或正在开发的有关标准机构提供的,例如Internet Engineering Task Force。 作为补充,Spring Security也提供了自己的一套验证功能。 Spring Security目前支持认证一体化和如下...

    Spring攻略中文版PDF

    因为上传大小的限制,分为两部分上传,这是第一部分,第二部分会在评论中给出链接 绝对是spring攻略中文版第二版 Spring专家力作 理论与实践完美结合 问题描述→解决方案→实现方法 第一部分 核心概念  第1章 ...

    Springboot整合Spring security+Oauth2+JWT搭建认证服务器,网关,微服务之间权限认证及授权

    OAuth2是一个关于授权的开放标准,核心思路是通过各类认证手段(具体什么手段OAuth2不关心)认证用户身份,并颁发token(令牌),使得第三方应用可以使用该令牌在限定时间、限定范围访问指定资源。

    spring security 登录、权限管理配置

    1)容器启动(MySecurityMetadataSource:loadResourceDefine加载系统资源与权限列表) 2)用户发出请求 3)过滤器拦截(MySecurityFilter:doFilter) 4)取得请求资源所需权限(MySecurityMetadataSource:get...

    Spring攻略英文版(附带源码)

     第3章 Spring中的Bean配置   3.1 在Spring IoC容器里配置Bean   3.1.1 问题描述   3.1.2 解决方案   3.1.3 实现方法   3.2 实例化Spring IoC容器   3.2.1 问题描述   3.2.2 解决方案   ...

    security:Spring Security 开发安全的REST服务 —— JoJozhai

    第3章 使用Spring MVC开发RESTful API 3-4 用户创建请求 3-5 修改和删除请求 3-6 服务异常处理 3-7 使用切片拦截REST服务 3-8 使用Filter和Interceptor拦截REST服务 3-9 使用REST方式处理文件服务 3-10 使用...

    Spring Security3 张卫滨(译)

    第一章 一个不安全应用的剖析 ........................................................................................... 8 安全审计........................................................................

    SpringCloud视频教程全套百度网盘

    第1章 SpringCloud简介 第2章 SpringCache缓存详细讲解及应用 第3章 Redis高级缓存讲解及应用 第4章 SpringSecurity安全详细讲解及应用 第5章 RabbitMQ高级消息的讲解及应用 第6章 ElasticSearch详细讲解及应用 第7...

    Spring-Security-Third-Edition:Spring Security第三版,由Packt发行

    Spring Security 3rd Edition自述文件该自述文件通常将记录启动和运行应用程序所需的所有步骤。JBCP日历应用程序Jim Bob CP日历应用程序4.00.00快照该代码已在开发,并且每个章节里程碑都有一个子项目。 在整本书中...

    justauth-spring-boot-security-starter:spring security 集成 JustAuth 实现第三方授权登录

    Spring security 集成 JustAuth 实现第三方授权登录脚手架: 一、特性 : 此项目从 用户管理脚手架(UMS): | ) 项目中分离. 支持所有 justAuth 支持的第三方登录,登录后自动注册 或 绑定 或 创建临时用户(). 支持定时...

    Spring攻略(第三版)源代码

    1. Spring Development Tools 2. Spring Core Tasks 3. Spring Annotation Driven Core Tasks 4. Spring @MVC 5. Spring REST 6. Spring Deployment to the Cloud 7. Spring Social 8. Spring Security 9. Spring ...

    SpringSecurity:Spring安全

    SpringSecurity第1部分初始设定第2部分我们向您展示了如何使用Spring的UserDetailService接口来实现自己的身份验证。第三部分定制表格第4部分使用Spring Security保护您的REST调用。

    Simple-Social-Login-System:一个基于springSecurity和springBoot的qq等第三方软件登录系统

    一个基于springSecurity+springBoot的社交化登录系统 1. 技术选型 springBoot:使用spring框架简单方便 springSecurity:与spring框架无缝连接 mysql:免费,方便 redis:强大,使用广泛的缓存 freemarker:...

    SpringBoot+Mybatis+SpringSecurity+Bootstrap+Layui开发的java web轻量级小巧视频网站系统

    SpringBoot+Mybatis+SpringSecurity+Bootstrap+Layui开发java web轻量级小巧视频网站系统 项目描述 PC端+手机端模式自适应 支持本地资源视频文件上传在线播放,同时支持在线资源链接上传(ed2k、迅雷、等资源)...

Global site tag (gtag.js) - Google Analytics