- 浏览: 455131 次
- 性别:
- 来自: 大连
-
博客专栏
-
-
《Spring Secur...
浏览量:385255
文章分类
最新评论
-
蒙奇君杰:
必须感谢一番!!!愿开源的态度为更多的人所拥有,所 认同!
关于对《Spring Security3》一书的翻译说明 -
601235723:
bbjavaeye 写道你好,有个问题请教一下我配了<b ...
《Spring Security3》第四章第一部分翻译下(自定义的UserDetailsService) -
bay0902:
中国互联网的脊梁
Spring Security 3全文下载 -
hdcustc:
项目源码下载 微博网盘里的那个依赖文件损坏了啊 能否提供个可 ...
Spring Security 3全文下载 -
i641878506:
楼主辛苦, 可以提供原书的原项目文件的下载么
Spring Security 3全文下载
第三章 增强用户体验
在本章中,我们将对JBCP Pets在线商店增加一些功能,这些新功能能够为用户提供更愉悦和可用的用户体验,同时提供一些对安全系统很重要的功能。
在本章中,我们将要:
l 按照你的意愿自定义登录和退出页面,并将它们与标准的Spring web MVC的控制器相关联;
l 使用remember me功能为用户提供便利,并理解其背后的安全含义;
l 构建用户账号管理功能,包括修改密码以及密码遗忘找回功能。
自定义登录页
你可能还记得在前一章中,我们使用了Spring Security的security命名空间的基本配置功能。这为我们提供了基本的登录、认证和授权功能,但是这肯定没有到达产品质量的要求。在我们向老板汇报进度前,要添加的一个很重要的增强功能就是使得登录界面在展现和行为上与我们在线应用的其他地方保持一致。
回忆一下现在的登录界面大致如下所示:
自动配置并没有为我们提供很多其他的功能,如为登录页面添加样式。我们要为站点增加以下的功能:
l 拥有页头、页脚以及与JBCP Pets样式一致的登录页;
l 允许用户退出的链接
l 允许用户修改密码的页面。
登录和退出的流程应该如下图所示:
我们将会通过一系列的练习来开发完善这个站点的结构。当开发登录和退出功能时,我们将会讲解所做的内容,所以当我们需要扩展站点的基本功能时,能够对于我们构建的内容有一个清晰的理解。
实现自定义的登录页
首先,我们需要一个集成于我们系统的登录页来替代默认的Spring Security登录页。需要的登录流程如下图所示:
实现登录的controller
我们需要添加一个Spring MVC的控制器来实现登录功能,以及以后的退出功能。JBCP Pets站点使用Spring MVC基于注解的机制来实现控制器与站点路径和资源的配置。让我们在包下com.packtpub.springsecurity.web.controller创建一个名为LoginLogoutController的controller,并包含以下的内容:
// 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.jsp的JSP文件。让我们添加一个包含登录form的简单JSP,它将被Spring Security识别和使用。在第二章中我们已经学到,为了保证接下来的行为能够被正确的执行,登录的form中有两个重要的元素必须要被正确的设置:
l Form action必须与UsernamePasswordAuthenticationFilter过滤器的action的配置相一致。默认的form action是j_spring_security_check;
l 用户名和密码的表单域要与servlet的标准相一致。默认j_username和j_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')"/> |
这将能够达到我们想要的效果:允许任何用户访问登录页而限制站点的其他部分只能是认证用户才能访问。到此为止,已经完成了登录功能。让我们看一下要添加退出功能都需要做些什么。
评论
![](/images/smiles/icon_eek.gif)
![](/images/smiles/icon_eek.gif)
![](/images/smiles/icon_eek.gif)
<strong><sec:authentication property="principal.username"/></strong>
需要先判断一下是不是已经认证了,如果认证了才显示已认证的username
<strong>
<sec:authorize access="isAuthenticated()">
<sec:authentication property="principal.username"/>
</sec:authorize>
</strong>
这个在章节末尾的时候才添加进来的,现在可以暂时注释掉
应该翻译为:按照最具体的规则到最模糊的规则来进行排序,也就是说优先匹配最具体的规则。
<strong><sec:authentication property="principal.username"/></strong>
需要先判断一下是不是已经认证了,如果认证了才显示已认证的username
<strong>
<sec:authorize access="isAuthenticated()">
<sec:authentication property="principal.username"/>
</sec:authorize>
</strong>
你可以到以下地址http://www.packtpub.com/support?nid=4435下载完整的源代码,因为压缩包比较大,不好直接传上来
多谢您的关注。这个类开始是没有任何方法的,仅仅是一个基类,书上没有写,随着后续章节不断扩展,到第五章结束时的源码为:
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;
}
}
![](/images/smiles/icon_wink.gif)
多谢多谢,继续努力
![](/images/smiles/icon_wink.gif)
发表评论
-
Spring Security 3全文下载
2012-03-15 20:31 20449本书已经翻译完成,提供给大家下载 以下地址为ITEYE的电子 ... -
《Spring Security3》附录翻译(参考资料)
2012-02-13 22:58 6619附录:参考材料 在本附录中, ... -
《Spring Security3》第十三章翻译(迁移到Spring Security 3)
2012-02-13 22:50 5399第十三章 迁移到Spring Security 3 ... -
《Spring Security3》第十二章翻译(Spring Security扩展)
2012-02-13 22:38 8045第十二章 Spring Security扩展 ... -
《Spring Security3》第十一章(客户端证书认证)第二部分翻译
2012-02-13 22:23 4992在Spring Security中配置客户端证书认证 ... -
《Spring Security3》第十一章(客户端证书认证)第一部分翻译
2012-02-13 22:00 6231第十一章 客户端证书认证(Client Cert ... -
《Spring Security3》第十章(CAS)第二部分翻译(CAS高级配置)
2012-01-19 13:07 8652高级CAS配置 ... -
《Spring Security3》第十章(CAS)第一部分翻译(CAS基本配置)
2012-01-19 12:54 12369第十章 使用中心认证服务(CAS)进行单点登录 ... -
《Spring Security3》第九章(LDAP)第三部分翻译(LDAP明确配置)
2012-01-19 12:44 6467明确的LDAP bean配置 ... -
《Spring Security3》第九章(LDAP)第二部分翻译(LDAP高级配置)
2012-01-19 12:36 7234LDAP的高级配置 一旦我们 ... -
《Spring Security3》第九章(LDAP)第一部分翻译(LDAP基本配置)
2012-01-19 12:22 6206第九章 LDAP目录服务 在本章中,我们 ... -
《Spring Security3》第八章第三部分翻译(属性交换)
2012-01-18 15:46 2964属性交换(Attribute Exchange) ... -
《Spring Security3》第八章第二部分翻译(OpenID用户的注册)
2012-01-18 13:39 5433OpenID用户的注册问 ... -
《Spring Security3》第八章第一部分翻译(OpenID与Spring Security)
2012-01-17 22:38 7572第八章 对OpenID开放 OpenID是 ... -
《Spring Security3》第七章第三部分翻译(ACL的注意事项)
2012-01-17 22:25 2716典型ACL部署所要考虑的事情 ... -
《Spring Security3》第七章第二部分翻译(高级ACL)(下)
2012-01-17 22:17 4217支持ACL的Spring表达式语言 SpEL对A ... -
《Spring Security3》第七章第二部分翻译(高级ACL)(上)
2012-01-10 22:59 4702高级ACL话题 一些高级的话 ... -
《Spring Security3》第七章第一部分翻译(访问控制列表ACL)
2011-12-30 22:02 9535第七章 访问控制列表(ACL) 在本章中, ... -
《Spring Security3》第六章第七部分翻译(认证事件处理与小结)
2011-11-22 22:37 5507认证事件处理 有一个重要的功能只能通 ... -
《Spring Security3》第六章第六部分翻译(Spring Security基于bean的高级配置)
2011-11-22 22:25 5535Spring Security基于bean的高级配置 ...
相关推荐
### 第一章:Spring Security3入门 该章节分为两个部分,介绍了Spring Security3的基础概念,包括如何设置安全上下文、理解Spring Security的架构以及如何使用Spring Security进行基本的认证和授权。 ### 第二章:...
自此之后,Spring Security 成为了 Spring 生态系统中的一个重要组成部分,不断迭代更新,以适应不断变化的安全需求和技术发展。 ##### 1.3 发行版本号 Spring Security 3.0.1 是在 Spring Security 3.0 的基础上...
Spring Security 是一个基于 Java 的安全框架,旨在提供身份验证、授权和访问控制等功能。下面是 Spring Security 的主要知识点: 一、身份验证(Authentication) 身份验证是指对用户身份的验证,以确保用户的...
《Spring Security3》第二章第三部分的翻译下篇主要涵盖了Spring Security的核心概念和技术,这部分内容是深入理解Spring Security架构和实现安全控制的关键。在本章节中,我们将详细探讨以下几个核心知识点: 1. *...
- Spring Security 可以与OAuth2框架集成,提供第三方服务的认证和授权,支持资源服务器、认证服务器和客户端的角色。 8. **Spring Security ACL**: - 对象级权限管理(ACL)允许开发者对应用内的具体对象实施细...
- Spring Security 3引入了CSRF(跨站请求伪造)防护,通过添加一个不可预测的令牌到表单提交中,防止恶意第三方发起未经授权的操作。 5. **国际化支持**: - 支持多语言界面,可以根据用户的首选语言显示错误...
教程文档则可能深入到实践操作,包括如何配置Spring Security、创建第一个安全应用、调试和测试安全设置,以及如何解决常见问题。通过学习这套文档和教程,开发者可以掌握Spring Security的核心原理,从而为自己的...
7. **OAuth2 and JWT支持**:Spring Security 提供了对OAuth2和JSON Web Tokens (JWT) 的支持,这在现代微服务架构中非常重要,因为它允许第三方应用安全地与你的服务进行交互。 8. **表达式语言(SpEL)**:Spring...
Spring Security 是一个强大的安全框架,用于为Java应用提供全面的安全管理解决方案。它是Spring生态系统的组成部分,专注于身份验证、授权和访问控制。Spring Security的核心特性包括: 1. **身份验证...
- OAuth2:SpringSecurity支持OAuth2协议,实现第三方登录和API保护。 - JWT(JSON Web Tokens):可使用JWT进行状态less的认证,提高系统的可扩展性。 - CORS(Cross-Origin Resource Sharing):SpringSecurity...
第二章:springsecurity起步 第三章:增强用户体验 第四章:凭证安全存储 第五章:精确的访问控制 第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用...
在“spring security第一个项目”中,我们将探讨如何搭建一个基础的Spring Security环境,实现用户登录验证以及权限控制。 首先,我们需要理解Spring Security的基本架构。它由四个主要组件组成:Filter Security ...
#### 第一章:一个不安全应用的剖析 **安全审计** - **目的**:识别系统中的安全隐患,并评估安全措施的有效性。 - **过程**:通过模拟攻击来测试系统的安全性,分析日志记录,评估现有安全策略。 **样例应用简介*...
Spring Security 3 是 Spring Security 框架的第三个主要版本,提供了许多新的功能和改进。下面将详细介绍 Spring Security 3 的配置和使用。 下载和安装 Spring Security 3 首先,需要从 Spring Security 官网...
Spring Security OAuth 是一个用于保护RESTful Web服务的框架,它为OAuth 1.0a和OAuth 2.0协议提供了全面的支持。在这个源码中,我们可能会看到如何将Spring Security与OAuth结合,以构建安全的Web应用程序和服务。...
Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,它是安全领域中Spring生态系统的一部分。Spring Security旨在为Java应用程序提供一个全面的安全解决方案,尤其适用于企业级应用场景。它主要...
- 学习 Spring Security 的第一步通常是创建一个简单的 "Hello World" 应用,这通常涉及添加必要的依赖和配置,以便启动基础的安全功能。 3. **单元测试**: - 在安全相关的开发中,单元测试是必不可少的,因为它...
Spring Security 是一个强大的和高度可定制的身份验证和...总的来说,Spring Security 3.x第五章的实例将帮助开发者深入理解这个框架的使用,通过具体的代码示例来实践安全性配置,从而更好地保护他们的Spring应用。
9. **OAuth2整合**:如果视频内容深入,可能会涉及到如何集成SpringSecurity与OAuth2服务提供商,实现第三方登录功能。 10. **安全最佳实践**:最后,可能会分享一些安全编码的最佳实践,例如避免SQL注入、XSS攻击...