- 浏览: 446594 次
- 性别:
- 来自: 大连
博客专栏
-
《Spring Secur...
浏览量:379171
文章分类
最新评论
-
蒙奇君杰:
必须感谢一番!!!愿开源的态度为更多的人所拥有,所 认同!
关于对《Spring Security3》一书的翻译说明 -
601235723:
bbjavaeye 写道你好,有个问题请教一下我配了<b ...
《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 20096本书已经翻译完成,提供给大家下载 以下地址为ITEYE的电子 ... -
《Spring Security3》附录翻译(参考资料)
2012-02-13 22:58 6407附录:参考材料 在本附录中, ... -
《Spring Security3》第十三章翻译(迁移到Spring Security 3)
2012-02-13 22:50 5178第十三章 迁移到Spring Security 3 ... -
《Spring Security3》第十二章翻译(Spring Security扩展)
2012-02-13 22:38 7782第十二章 Spring Security扩展 ... -
《Spring Security3》第十一章(客户端证书认证)第二部分翻译
2012-02-13 22:23 4757在Spring Security中配置客户端证书认证 ... -
《Spring Security3》第十一章(客户端证书认证)第一部分翻译
2012-02-13 22:00 6114第十一章 客户端证书认证(Client Cert ... -
《Spring Security3》第十章(CAS)第二部分翻译(CAS高级配置)
2012-01-19 13:07 8565高级CAS配置 ... -
《Spring Security3》第十章(CAS)第一部分翻译(CAS基本配置)
2012-01-19 12:54 12213第十章 使用中心认证服务(CAS)进行单点登录 ... -
《Spring Security3》第九章(LDAP)第三部分翻译(LDAP明确配置)
2012-01-19 12:44 6377明确的LDAP bean配置 ... -
《Spring Security3》第九章(LDAP)第二部分翻译(LDAP高级配置)
2012-01-19 12:36 7076LDAP的高级配置 一旦我们 ... -
《Spring Security3》第九章(LDAP)第一部分翻译(LDAP基本配置)
2012-01-19 12:22 6095第九章 LDAP目录服务 在本章中,我们 ... -
《Spring Security3》第八章第三部分翻译(属性交换)
2012-01-18 15:46 2865属性交换(Attribute Exchange) ... -
《Spring Security3》第八章第二部分翻译(OpenID用户的注册)
2012-01-18 13:39 5309OpenID用户的注册问 ... -
《Spring Security3》第八章第一部分翻译(OpenID与Spring Security)
2012-01-17 22:38 7493第八章 对OpenID开放 OpenID是 ... -
《Spring Security3》第七章第三部分翻译(ACL的注意事项)
2012-01-17 22:25 2648典型ACL部署所要考虑的事情 ... -
《Spring Security3》第七章第二部分翻译(高级ACL)(下)
2012-01-17 22:17 4133支持ACL的Spring表达式语言 SpEL对A ... -
《Spring Security3》第七章第二部分翻译(高级ACL)(上)
2012-01-10 22:59 4558高级ACL话题 一些高级的话 ... -
《Spring Security3》第七章第一部分翻译(访问控制列表ACL)
2011-12-30 22:02 9432第七章 访问控制列表(ACL) 在本章中, ... -
《Spring Security3》第六章第七部分翻译(认证事件处理与小结)
2011-11-22 22:37 5365认证事件处理 有一个重要的功能只能通 ... -
《Spring Security3》第六章第六部分翻译(Spring Security基于bean的高级配置)
2011-11-22 22:25 5376Spring Security基于bean的高级配置 ...
相关推荐
第一部分前言 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的使用中,有4种方法: 一种是全部利用配置文件,将用户、权限、资源(url)硬编码在xml文件中,已经实现过,并经过验证; 二种是用户和权限用数据库存储,而资源(url)和权限的对应采用硬编码...
Spring Security-3.0.1 中文官方文档(翻译版) 这次发布的Spring Security-3.0.1 是一个bug fix 版,主要是对3.0 中存在的一些问题进 行修 正。文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行...
Spring Security3的使用方法有4种: 一种是全部利用配置文件,将用户、权限、资源(url)硬编码在xml文件中。 二种是用户和权限用数据库存储,而资源(url)和权限的对应采用硬编码配置。 三种是细分角色和权限,并将...
demo详细讲解了springsecurity自定义UserDetailsService实现方式及security功能模块的配置
4. Spring Security社区 4.1. 任务跟踪 4.2. 成为参与者 4.3. 更多信息 II. 结构和实现 5. 技术概述 5.1. 运行环境 5.2. 核心组件 5.2.1. SecurityContextHolder, SecurityContext 和 Authentication对象 ...
使用JWT与Spring WebFlux和Spring Security Reactive进行身份验证和授权首先阅读的好文档在开始之前,我建议您先阅读下一份参考启用Spring WebFlux安全性在你的应用程序首先使Webflux安全@EnableWebFluxSecurity...
4. Spring Security社区 4.1. 任务跟踪 4.2. 成为参与者 4.3. 更多信息 II. 结构和实现 5. 技术概述 5.1. 运行环境 5.2. 核心组件 5.2.1. SecurityContextHolder, SecurityContext 和 ...
基于spring boot+spring security+jwt实现的基础auth机制。在SpringBootApplication上添加@EnableWebSecurityJwt。同时需要自己实现一个UserDetailsService。
Springboot+SpringSecurity+JWT+redis 多参数登录验证,重新 UserDetailsService 实现 loadUserByUserna 多参数方法
spring security 基础项目 包含所需sql 用户实体 映射mapper UserDetailsService改造等 可基本满足 security 入门研究需求
详解Spring Security进阶身份认证之UserDetailsService(附源码)-附件资源
SpringSecurity使用userDetailsService的方式,访问数据库的权限系统,进行认证操作
4. Working with Spring Boot 5. Learning about Spring Boot Features 6. Moving to Production 7. Advanced Topics II. Getting Started 8. Introducing Spring Boot 9. System Requirements 9.1. Servlet ...
security的四种方法 1. 全部利用配置文件 不使用数据库,全部信息写在配置文件中,如拦截的URL及对应权限,指定用户名、密码和对应权限 2. 数据库+配置文件 数据库存储用户和权限,硬编码配置URL和对应权限 根据...
1、用户验证实现UserDetailsService接口,注意角色需要ROLE_kaitou 2、扩展WebSecurityConfigurerAdapter,覆盖configure(HttpSecurity http) 第一句必须是http.antMatcher("/portal/**").authorizeRequests(),...
- 在Controller中使用@PreAuthorize等注解需要在spring-web配置文件中扫描security包下的类 6. 引用application.properties中的属性的方式:@ConfigurationProperties(prefix = "spring.mail") + @Component + ...
Spring Security新增手机号、校验码校验方式,拓展了功能。关键组件就是UserDetails(用户信息描述)、UserDetailsService(操作账户的服务)、WebAuthenticationDetails(提供额外信息认证)、...
Spring Boot 2 Oauth2资源和授权服务器 使用用户和客户端数据库(JPA,Hibernate,MySQL)的Spring Boot 2 OAuth2资源和授权服务器实现 入门 这些说明将为您提供在本地计算机上运行并运行的项目的副本,以进行开发...