- 浏览: 306127 次
文章分类
最新评论
-
流年末年:
那四个参数还是没看懂.....能不能解释下showPassst ...
我写的密码强度验证方法(原创) -
kingcs2008:
// 验证pws.jsshowPassstrength(&qu ...
我写的密码强度验证方法(原创) -
h957355152:
请问博主这个怎么用呢?我直接放到jsp里面调用showPass ...
我写的密码强度验证方法(原创) -
qq_15138059:
我写的全国省市县三级联动菜单,拿出来和大家分享了(原创) -
valenon:
评论呢?从MAIL FROM命令开始貌似就出错了:500 Er ...
如何发送伪造的电子邮件
实现自定义的JDBC UserDetailsService
正如在前面章节中的那个练习,我们将以基本的 JdbcDaoImpl 作为起点,将其进行扩展以支持修改密码功能。
创建一个自定义的 JDBC UserDetailsService
在 com.packtpub.springsecurity.security 包下创建如下的类:
- public class CustomJdbcDaoImpl extends JdbcDaoImpl implements
- IChangePassword {
- public void changePassword(String username, String password) {
- getJdbcTemplate()
- update("UPDATE USERS SET PASSWORD = ? WHERE USERNAME = ?" ,
- password, username);
- }
- }
你可以看到这个类扩展了 JdbcDaoImpl 默认类,提供了按照用户请求更新数据库中密码的功能。我们使用标准的 Spring JDBC模板 完成这个功能。
为自定义的 JDBC UserDetailsService 添加 Spring bean 声明
在 dogstore-base.xml 配置文件中,添加如下的 Spring Bean 声明:
- < bean id = "jdbcUserService"
- class = "com.packtpub.springsecurity.security.CustomJdbcDaoImpl" >
- < property name = "dataSource" ref = "dataSource" />
- </ bean >
同样的, dataSource 的 Bean 引用指向了 <embedded-database> 声明,我们使用这个声明来安装 HSQL 内存数据库。
你会发现自定义的 UserDetailsService 允许我们与数据库直接交互。在接下来的例子中,我们将使用这个功能来扩展 UserDetailsService 的基本功能。在使用 Spring Security 的复杂应用中,这种类型的个性化是很常见的。
基于JDBC 的内置用户管理
正如上面简单 JdbcDaoImpl 扩展所描述的那样,开发人员可能会扩展这个类,但同时也会保留基本的功能。而我们要实现更复杂功能时,如用户注册( online store 所必须的)与用户管理功能、站点的管理员创建用户、更新密码等,又会怎样呢?
尽管这些功能借助 JDBC 语句都能相对容易的实现,但是 Spring Security 还是为我们提供了内置的功能以支持对数据库里的用户进行创建、读取、更新和删除的操作。这对简单的系统来说是很有用的,同时也为构建自定义需求的用户提供了很好的起点。
实现类 o.s.s.provisioning.JdbcUserDetailsManager 扩展了 JdbcDaoImpl 的功能,提供了一些很有用的与用户相关的方法,这些方法的一部分在 o.s.s.provisioning.UserDetailsManager 接口中进行了定义:
方法 |
描述 |
void createUser(UserDetails user) |
根据给定的 UserDetails 创建一个新用户,并包含所有声明的 GrantedAuthority 。 |
void updateUser(final UserDetails user) |
根据给定的 UserDetails 更新一个用户。更新其 GrantedAuthority 并将其从用户缓存中清除。 |
void deleteUser(String username) |
根据给定的用户名删除用户,并将其从用户缓存中清除。 |
boolean userExists(String username) |
根据给定的用户名判断用户是否存在(不管是否可用)。 |
void changePassword(String oldPassword, String newPassword) |
修改当期登录用户的密码。为了使得操作成功,用户必须提供正确的当期密码。 |
正如你所见, JdbcUserDetailsManager 的 changePassword 方法正好满足了我们 CustomJdbcDaoImpl 的不足——在修改之前,它会检验用户已存在密码。让我们看一下将 CustomJdbcDaoImpl 替换为 JdbcUserDetailsManager 需要怎样的配置步骤。
首先,我们需要在 dogstore-base.xml 中声明 JdbcUserDetailsManager bean :
- < bean id = "jdbcUserService"
- class ="org.springframework.security
- .provisioning.JdbcUserDetailsManager">
- < property name = "dataSource" ref = "dataSource" />
- < property name = "authenticationManager"
- ref = "authenticationManager" />
- </ bean >
对 AuthenticationManager 的引用要匹配我们之前 dogstore-security.xml 文件中声明的 <authentication-manager> 的 alias 。不要忘记注释掉 CustomJdbcDaoImpl 的声明——我们暂时不会使用它。
接下来,我们需要对 changePassword.jsp 做一些小的调整:
- < h1 > Change Password </ h1 >
- < form method = "post" >
- < label for = "oldpassword" > Old Password </ label > :
- < input id = "oldpassword" name = "oldpassword"
- size = "20" maxlength = "50" type = "password" />
- < br />
- < label for = "password" > New Password </ label > :
- < input id = "password" name = "password" size = "20"
- maxlength = "50" type = "password" />
- < br />
最后,需要简单调整 AccountController 。将 @Autowired 引用 IChangePassword 的实现替换为:
submitChangePasswordPage 方法也会更加简单了,因为要依赖的当前用户信息将会由 JdbcUserDetailsManager 为我们确定:
- public String submitChangePasswordPage( @RequestParam ( "oldpassword" )
- String oldPassword,
- @RequestParam ( "password" ) String newPassword) {
- userDetailsManager.changePassword(oldPassword, newPassword);
- SecurityContextHolder.clearContext();
- return "redirect:home.do" ;
- }
在这些修改完成后,你可以重启应用并尝试新的修改密码功能。
注意当你没有提供正确的密码时将会发生什么。试想一下会发生什么?并尝试思考怎样调整能使得对用户更友好。
尽管我们没有阐述 JdbcUserDetailsManager 提供的所有功能,但是可以看出它能很容易与简单的 JSP 页面结合在一起(当然要进行适当授权)以允许管理员来管理站点的用户——这对产品级别的应用是必要的。
发表评论
-
spring-security3 配置和使用(二)承上
2011-12-22 06:42 10642、xml配置,配置内容如下: Xml代码 ... -
spring-security3 配置和使用 (一)(转载)
2011-12-22 06:43 958最近项目中要使用到spring-security,可能研究 ... -
SpringSecurity3.X--一个简单实现(转载)
2011-12-22 06:43 2679作者对springsecurity研究不深,算是个初学者吧,最 ... -
SpringSecurity3.X--验证码(转载)
2011-12-22 06:44 1069一般来说,登录时都会要求用户输入验证码,以防止恶意登录。 可 ... -
SpringSecurity3.X--前台与后台登录认证(转载)
2011-12-23 06:33 3461不过一般我们在管理系统时都会分前台与后台,也就是说,前台与后台 ... -
SpringSecurity3.X--remember-me(转载)
2011-12-22 06:44 1749笔者在SpringSecurity中配置remember-me ... -
《Spring Security3》第六章第七部分翻译(认证事件处理与小结)
2011-12-23 06:34 1349认证事件处理 ... -
《Spring Security3》第六章第六部分翻译(Spring Security基于bean的高级配置)
2011-12-23 06:34 1059Spring Security 基于bean 的高级配 ... -
《Spring Security3》第六章第五部分翻译(手动配置Spring Security设施的bean)(转载)
2011-12-23 06:34 1032手动配置Spring Security 设施的be ... -
《Spring Security3》第六章第四部分翻译(异常处理)(转载)
2011-12-23 06:34 1248理解和配置异常处理 ... -
《Spring Security3》第六章第三部分翻译(Session的管理和并发)(转载)
2011-12-24 10:20 4232Session 的管理和并发 ... -
《Spring Security3》第六章第二部分翻译(自定义AuthenticationProvider)(转载)
2011-12-24 10:21 1527实现自定义的 AuthenticationProvide ... -
《Spring Security3》第六章第一部分翻译(自定义安全过滤器)(转载)
2011-12-24 10:21 1128第六章 高级配置和扩展 到目前为止,我 ... -
《Spring Security3》第五章第四部分翻译(方法安全的高级知识和小结)(转载)
2011-12-24 10:22 1061方法安全的高级知 ... -
《Spring Security3》第五章第三部分翻译(保护业务层)
2011-12-24 10:22 896保护业务层 到目前为止,在 ... -
《Spring Security3》第五章第二部分翻译下(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 1030使用控制器逻辑进行有条件渲染内容 ... -
《Spring Security3》第五章第二部分翻译上(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 977实现授权精确控制的方法 精确的授权指的是基于用 ... -
《Spring Security3》第五章第一部分翻译(重新思考应用功能和安全) (转载)
2011-12-25 00:47 952第五章 精确的 ... -
《Spring Security3》第四章第四部分翻译(Remember me后台存储和SSL)(转载)
2011-12-25 00:47 1270将 Remember me 功能 ... -
《Spring Security3》第四章第三部分翻译下(密码加salt)(转载)
2011-12-25 00:48 1815你是否愿意在密码上添加点salt ? 如果安 ...
相关推荐
### 第一章:Spring Security3入门 该章节分为两个部分,介绍了Spring Security3的基础概念,包括如何设置安全上下文、理解Spring Security的架构以及如何使用Spring Security进行基本的认证和授权。 ### 第二章:...
自此之后,Spring Security 成为了 Spring 生态系统中的一个重要组成部分,不断迭代更新,以适应不断变化的安全需求和技术发展。 ##### 1.3 发行版本号 Spring Security 3.0.1 是在 Spring Security 3.0 的基础上...
1. **SpringSecurity核心概念** - **Filter Chain**: SpringSecurity通过一系列过滤器实现其安全功能,这些过滤器构成了Filter Chain。每个过滤器负责特定的安全任务,如认证、授权等。 - **Authentication**: ...
- Spring Security 3引入了CSRF(跨站请求伪造)防护,通过添加一个不可预测的令牌到表单提交中,防止恶意第三方发起未经授权的操作。 5. **国际化支持**: - 支持多语言界面,可以根据用户的首选语言显示错误...
3. **用户认证**:详细阐述如何实现用户登录功能,包括自定义UserDetailsService以加载用户信息,以及使用内存、数据库或其他数据源存储用户凭据。同时,可能会介绍基于表单登录、JWT令牌认证等多种认证方式。 4. *...
在“spring security第一个项目”中,我们将探讨如何搭建一个基础的Spring Security环境,实现用户登录验证以及权限控制。 首先,我们需要理解Spring Security的基本架构。它由四个主要组件组成:Filter Security ...
Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,它是安全领域中Spring生态系统的一部分。Spring Security旨在为Java应用程序提供一个全面的安全解决方案,尤其适用于企业级应用场景。它主要...
#### 第一章:一个不安全应用的剖析 **安全审计** - **目的**:识别系统中的安全隐患,并评估安全措施的有效性。 - **过程**:通过模拟攻击来测试系统的安全性,分析日志记录,评估现有安全策略。 **样例应用简介*...
- 学习 Spring Security 的第一步通常是创建一个简单的 "Hello World" 应用,这通常涉及添加必要的依赖和配置,以便启动基础的安全功能。 3. **单元测试**: - 在安全相关的开发中,单元测试是必不可少的,因为它...
1. **SpringSecurity架构**:SpringSecurity的核心架构由多个组件构成,包括过滤器链、认证管理、权限控制等。其中,过滤器链是SpringSecurity处理请求的第一道防线,它会拦截所有HTTP请求并进行安全检查。 2. **...
在第一种方法中,Spring Security的示例项目`spring-security-samples-tutorial-3.0.2.RELEASE`提供了硬编码配置的参考,它演示了如何在XML配置文件中定义用户、密码和权限。这种方法适合初学者快速了解Spring ...
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。它提供了认证、授权和访问控制等功能,使得开发者可以轻松地在应用程序中实现复杂的安全需求。在这个名为 "mysecurity" 的压缩包中,很可能是...
SpringSecurity 是一个强大的且高度可定制的身份验证和访问控制框架,用于保护基于Java的应用程序。在本示例中,我们将探讨如何使用 SpringSecurity 构建一个基本的认证和授权流程。 首先,Spring Security 的核心...
##### 第4章:自定义登录页面 **4.1 实现自定义登录页面** Spring Security 允许我们定制登录界面,包括样式、布局等。首先,需要创建一个 HTML 页面作为登录页,并在配置文件中指定登录页的位置。 ```xml ...
- Spring Security 3.x也可以与OAuth2协议集成,支持第三方服务的授权,提供安全的API访问。 8. **自定义扩展** - Spring Security的灵活性允许开发者根据需求自定义认证和授权策略,可以通过实现接口或继承类来...
在SpringSecurity的配置中,会定义一个自定义的AuthenticationProvider来处理用户的登录认证,以及UserDetailsService来获取用户信息。此外,还需要配置HttpSecurity以拦截特定URL,根据用户的角色和权限决定是否...
"级别的项目通常是编程初学者的第一步,而“入门”则表明这适用于那些初次接触Spring Security的人。标签中的“spring security”是核心关键词,指的是这个项目将围绕Spring Security框架进行,帮助新手了解其工作...
Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于Java应用程序。它为Web应用程序和企业级应用提供了全面的安全解决方案。在这个“spring-security”案例中,我们将深入探讨Spring Security...
Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于Java应用程序。它提供了全面的安全解决方案,包括用户认证、授权、CSRF防护、会话管理等。在深入研究Spring Security的源码之前,我们需要...
3. **过滤器链**:Spring Security 使用一系列过滤器来拦截请求并执行安全逻辑,如 `AuthenticationFilter` 和 `AuthorizationFilter`。 **二、设置项目** 1. **添加依赖**:在 Maven 或 Gradle 项目中添加 Spring...