- 浏览: 299741 次
文章分类
最新评论
-
流年末年:
那四个参数还是没看懂.....能不能解释下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 9722、xml配置,配置内容如下: Xml代码 ... -
spring-security3 配置和使用 (一)(转载)
2011-12-22 06:43 869最近项目中要使用到spring-security,可能研究 ... -
SpringSecurity3.X--一个简单实现(转载)
2011-12-22 06:43 2623作者对springsecurity研究不深,算是个初学者吧,最 ... -
SpringSecurity3.X--验证码(转载)
2011-12-22 06:44 1014一般来说,登录时都会要求用户输入验证码,以防止恶意登录。 可 ... -
SpringSecurity3.X--前台与后台登录认证(转载)
2011-12-23 06:33 3386不过一般我们在管理系统时都会分前台与后台,也就是说,前台与后台 ... -
SpringSecurity3.X--remember-me(转载)
2011-12-22 06:44 1700笔者在SpringSecurity中配置remember-me ... -
《Spring Security3》第六章第七部分翻译(认证事件处理与小结)
2011-12-23 06:34 1267认证事件处理 ... -
《Spring Security3》第六章第六部分翻译(Spring Security基于bean的高级配置)
2011-12-23 06:34 1023Spring Security 基于bean 的高级配 ... -
《Spring Security3》第六章第五部分翻译(手动配置Spring Security设施的bean)(转载)
2011-12-23 06:34 972手动配置Spring Security 设施的be ... -
《Spring Security3》第六章第四部分翻译(异常处理)(转载)
2011-12-23 06:34 1169理解和配置异常处理 ... -
《Spring Security3》第六章第三部分翻译(Session的管理和并发)(转载)
2011-12-24 10:20 4197Session 的管理和并发 ... -
《Spring Security3》第六章第二部分翻译(自定义AuthenticationProvider)(转载)
2011-12-24 10:21 1438实现自定义的 AuthenticationProvide ... -
《Spring Security3》第六章第一部分翻译(自定义安全过滤器)(转载)
2011-12-24 10:21 1057第六章 高级配置和扩展 到目前为止,我 ... -
《Spring Security3》第五章第四部分翻译(方法安全的高级知识和小结)(转载)
2011-12-24 10:22 995方法安全的高级知 ... -
《Spring Security3》第五章第三部分翻译(保护业务层)
2011-12-24 10:22 852保护业务层 到目前为止,在 ... -
《Spring Security3》第五章第二部分翻译下(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 997使用控制器逻辑进行有条件渲染内容 ... -
《Spring Security3》第五章第二部分翻译上(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 901实现授权精确控制的方法 精确的授权指的是基于用 ... -
《Spring Security3》第五章第一部分翻译(重新思考应用功能和安全) (转载)
2011-12-25 00:47 927第五章 精确的 ... -
《Spring Security3》第四章第四部分翻译(Remember me后台存储和SSL)(转载)
2011-12-25 00:47 1217将 Remember me 功能 ... -
《Spring Security3》第四章第三部分翻译下(密码加salt)(转载)
2011-12-25 00:48 1745你是否愿意在密码上添加点salt ? 如果安 ...
相关推荐
第一部分前言 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 中存在的一些问题进 行修 正。文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行...
demo详细讲解了springsecurity自定义UserDetailsService实现方式及security功能模块的配置
Spring Security3的使用方法有4种: 一种是全部利用配置文件,将用户、权限、资源(url)硬编码在xml文件中。 二种是用户和权限用数据库存储,而资源(url)和权限的对应采用硬编码配置。 三种是细分角色和权限,并将...
4. Spring Security社区 4.1. 任务跟踪 4.2. 成为参与者 4.3. 更多信息 II. 结构和实现 5. 技术概述 5.1. 运行环境 5.2. 核心组件 5.2.1. SecurityContextHolder, SecurityContext 和 ...
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...
基于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资源和授权服务器实现 入门 这些说明将为您提供在本地计算机上运行并运行的项目的副本,以进行开发...