- 浏览: 452520 次
- 性别:
- 来自: 大连
博客专栏
-
《Spring Secur...
浏览量:383410
文章分类
最新评论
-
蒙奇君杰:
必须感谢一番!!!愿开源的态度为更多的人所拥有,所 认同!
关于对《Spring Security3》一书的翻译说明 -
601235723:
<div class="quote_title ...
《Spring Security3》第四章第一部分翻译下(自定义的UserDetailsService) -
bay0902:
中国互联网的脊梁
Spring Security 3全文下载 -
hdcustc:
项目源码下载 微博网盘里的那个依赖文件损坏了啊 能否提供个可 ...
Spring Security 3全文下载 -
i641878506:
楼主辛苦, 可以提供原书的原项目文件的下载么
Spring Security 3全文下载
实现自定义的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的实现替换为:
@Autowired private UserDetailsManager userDetailsManager;
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页面结合在一起(当然要进行适当授权)以允许管理员来管理站点的用户——这对产品级别的应用是必要的。
评论
我配了
<bean id="jdbcUserService"
class="org.springframework.security
.provisioning.JdbcUserDetailsManager">
<property name="dataSource" ref="dataSource"/>
<property name="authenticationManager"
ref="authenticationManager"/>
</bean>
然后在<authentication-manager alias="authenticationManager"> 又引用了jdbcUserService造成了循环引用,这个你是怎么解决的
请问你循环引用的问题解决了吗?
是不是会通过呢,因为已经更改了changepassword的实现,在实现内没有处理这种情况。
是不是会通过呢,因为已经更改了changepassword的实现,在实现内没有处理这种情况。
我不知道我这样配置对不对,两个地方都引用到了myDataSources
xml配置如下:
<http auto-config="true" use-expressions="true"> <intercept-url pattern="/login.do" access="permitAll"/> <intercept-url pattern="/account/*.do" access="hasRole('ROLE_ADMIN')"/> <intercept-url pattern="/*" access="hasRole('ROLE_USER')"/> <form-login login-page="/login.do"/> <logout invalidate-session="true" logout-success-url="/" logout-url="/logout.do"/> </http> <authentication-manager alias="authenticationManager"> <authentication-provider > <jdbc-user-service data-source-ref="myDataSource" users-by-username-query="select username, password,enabled from users where username=?" authorities-by-username-query="select a.username, a.authority from authorities a,users u where u.username = a.username and a.username=?" /> </authentication-provider> </authentication-manager> <beans:bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <beans:property name="driverClassName" value="com.mysql.jdbc.Driver"/> <beans:property name="url" value="jdbc:mysql://127.0.0.1:3306/testdb"/> <beans:property name="username" value="root"/> <beans:property name="password" value="root"/> </beans:bean> <beans:bean id="jdbcUserService" class="org.springframework.security.provisioning.JdbcUserDetailsManager"> <beans:property name="dataSource" ref="myDataSource"/> <beans:property name="authenticationManager" ref="authenticationManager"/> </beans:bean>
我配了
<bean id="jdbcUserService"
class="org.springframework.security
.provisioning.JdbcUserDetailsManager">
<property name="dataSource" ref="dataSource"/>
<property name="authenticationManager"
ref="authenticationManager"/>
</bean>
然后在<authentication-manager alias="authenticationManager"> 又引用了jdbcUserService造成了循环引用,这个你是怎么解决的
对于你说的循环引用,我不知是怎么回事,我启动tomcat发现没有bean userDetailsManager,所以造成注入
@Autowired
private UserDetailsManager userDetailsManager;
失败。后来想想应该注入jdbcUserUservice,所以将@Autowired 改为@Resource(name="jdbcUserService")
发现一切很正常,功能正如书所说,改变密码后使用改变密码后的密码才能登录。
我配了
<bean id="jdbcUserService"
class="org.springframework.security
.provisioning.JdbcUserDetailsManager">
<property name="dataSource" ref="dataSource"/>
<property name="authenticationManager"
ref="authenticationManager"/>
</bean>
然后在<authentication-manager alias="authenticationManager"> 又引用了jdbcUserService造成了循环引用,这个你是怎么解决的
发表评论
-
Spring Security 3全文下载
2012-03-15 20:31 20365本书已经翻译完成,提供给大家下载 以下地址为ITEYE的电子 ... -
《Spring Security3》附录翻译(参考资料)
2012-02-13 22:58 6542附录:参考材料 在本附录中, ... -
《Spring Security3》第十三章翻译(迁移到Spring Security 3)
2012-02-13 22:50 5322第十三章 迁移到Spring Security 3 ... -
《Spring Security3》第十二章翻译(Spring Security扩展)
2012-02-13 22:38 7965第十二章 Spring Security扩展 ... -
《Spring Security3》第十一章(客户端证书认证)第二部分翻译
2012-02-13 22:23 4919在Spring Security中配置客户端证书认证 ... -
《Spring Security3》第十一章(客户端证书认证)第一部分翻译
2012-02-13 22:00 6197第十一章 客户端证书认证(Client Cert ... -
《Spring Security3》第十章(CAS)第二部分翻译(CAS高级配置)
2012-01-19 13:07 8626高级CAS配置 ... -
《Spring Security3》第十章(CAS)第一部分翻译(CAS基本配置)
2012-01-19 12:54 12332第十章 使用中心认证服务(CAS)进行单点登录 ... -
《Spring Security3》第九章(LDAP)第三部分翻译(LDAP明确配置)
2012-01-19 12:44 6445明确的LDAP bean配置 ... -
《Spring Security3》第九章(LDAP)第二部分翻译(LDAP高级配置)
2012-01-19 12:36 7177LDAP的高级配置 一旦我们 ... -
《Spring Security3》第九章(LDAP)第一部分翻译(LDAP基本配置)
2012-01-19 12:22 6174第九章 LDAP目录服务 在本章中,我们 ... -
《Spring Security3》第八章第三部分翻译(属性交换)
2012-01-18 15:46 2928属性交换(Attribute Exchange) ... -
《Spring Security3》第八章第二部分翻译(OpenID用户的注册)
2012-01-18 13:39 5397OpenID用户的注册问 ... -
《Spring Security3》第八章第一部分翻译(OpenID与Spring Security)
2012-01-17 22:38 7560第八章 对OpenID开放 OpenID是 ... -
《Spring Security3》第七章第三部分翻译(ACL的注意事项)
2012-01-17 22:25 2700典型ACL部署所要考虑的事情 ... -
《Spring Security3》第七章第二部分翻译(高级ACL)(下)
2012-01-17 22:17 4200支持ACL的Spring表达式语言 SpEL对A ... -
《Spring Security3》第七章第二部分翻译(高级ACL)(上)
2012-01-10 22:59 4665高级ACL话题 一些高级的话 ... -
《Spring Security3》第七章第一部分翻译(访问控制列表ACL)
2011-12-30 22:02 9490第七章 访问控制列表(ACL) 在本章中, ... -
《Spring Security3》第六章第七部分翻译(认证事件处理与小结)
2011-11-22 22:37 5472认证事件处理 有一个重要的功能只能通 ... -
《Spring Security3》第六章第六部分翻译(Spring Security基于bean的高级配置)
2011-11-22 22:25 5494Spring Security基于bean的高级配置 ...
相关推荐
自此之后,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. **国际化支持**: - 支持多语言界面,可以根据用户的首选语言显示错误...
在“spring security第一个项目”中,我们将探讨如何搭建一个基础的Spring Security环境,实现用户登录验证以及权限控制。 首先,我们需要理解Spring Security的基本架构。它由四个主要组件组成:Filter Security ...
Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,它是安全领域中Spring生态系统的一部分。Spring Security旨在为Java应用程序提供一个全面的安全解决方案,尤其适用于企业级应用场景。它主要...
#### 第一章:一个不安全应用的剖析 **安全审计** - **目的**:识别系统中的安全隐患,并评估安全措施的有效性。 - **过程**:通过模拟攻击来测试系统的安全性,分析日志记录,评估现有安全策略。 **样例应用简介*...
3. **用户认证**:详细阐述如何实现用户登录功能,包括自定义UserDetailsService以加载用户信息,以及使用内存、数据库或其他数据源存储用户凭据。同时,可能会介绍基于表单登录、JWT令牌认证等多种认证方式。 4. *...
- 学习 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 的核心...
- Spring Security 3.x也可以与OAuth2协议集成,支持第三方服务的授权,提供安全的API访问。 8. **自定义扩展** - Spring Security的灵活性允许开发者根据需求自定义认证和授权策略,可以通过实现接口或继承类来...
在SpringSecurity的配置中,会定义一个自定义的AuthenticationProvider来处理用户的登录认证,以及UserDetailsService来获取用户信息。此外,还需要配置HttpSecurity以拦截特定URL,根据用户的角色和权限决定是否...
Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于Java应用程序。它提供了全面的安全解决方案,包括用户认证、授权、CSRF防护、会话管理等。在深入研究Spring Security的源码之前,我们需要...
3. **过滤器链**:Spring Security 使用一系列过滤器来拦截请求并执行安全逻辑,如 `AuthenticationFilter` 和 `AuthorizationFilter`。 **二、设置项目** 1. **添加依赖**:在 Maven 或 Gradle 项目中添加 Spring...
"级别的项目通常是编程初学者的第一步,而“入门”则表明这适用于那些初次接触Spring Security的人。标签中的“spring security”是核心关键词,指的是这个项目将围绕Spring Security框架进行,帮助新手了解其工作...
Spring Security 是一个强大的且高度可定制的框架,用于为Java应用程序提供身份验证和授权服务。它主要用于保护基于Spring的应用程序,但也可以应用于非Spring应用程序。本笔记将深入探讨Spring Security的核心概念...