首先看代码:


  1. <authentication-manager alias="authenticationManager">
  2. <authentication-provider user-service-ref="myUserDetailsService">
  3. <password-encoder ref="myPasswordEncode">
  4. <salt-source user-property="salt"/>
  5. </password-encoder>
  6. </authentication-provider>
  7. </authentication-manager>

  1. <beans:bean id="myPasswordEncode" class="pw.bany.security.MyPasswordEncode">
  2. <beans:constructor-arg name="encode" value="md5"></beans:constructor-arg>
  3. </beans:bean>

如果我们要自己控制密码权限的验证,可以在配置中使用<password-encoder ref="myPasswordEncode">来指定自己的密码验证类,该类继承自MessageDigestPasswordEncoder。需要我们复写了public boolean isPasswordValid(String savePass, String submitPass, Object salt)方法,如果返回true,表示验证通过。上面代码还为MyPasswordEncode传入encode属性,来设置MyPasswordEncode中encode(本文下面的代码没有用到)。这样在isPasswordValid就可以用到需要加密的算法。isPasswordValid中savePass为数据库中加密保存的密码,submitPass为用户登录时提交的明文密码。


  1. @Override
  2. // 如果返回true,则验证通过。
  3. public boolean isPasswordValid(String savePass, String submitPass,
  4. Object salt) {
  5. return savePass.equalsIgnoreCase(Util.MD5WithSalt(submitPass,
  6. salt.toString()));
  7. }

Util.MD5WithSalt(submitPass,salt.toString()),是我们的加密方法,此处没贴出源码,网上很多。这里的salt需要特别注意一下,怎么才能把数据库中的salt传过来的问题。

上面配置中使用了<salt-source user-property="salt"/>来指定salt,但是系统是怎么知道在数据库中的salt字段呢?其实这里实际上是指定了org.springframework.security.core.userdetails.User中的一个属性,但是这个类中并没有这个属性,此时,需要我们重写这个类,为该类加入salt属性。


  1. package pw.bany.security;
  2. import java.util.Collection;
  3. import org.springframework.security.core.GrantedAuthority;
  4. import org.springframework.security.core.userdetails.User;
  5. public class SaltedUser extends User {
  6. private String salt;
  7. public SaltedUser(String username, String password, boolean enabled,
  8. boolean accountNonExpired, boolean credentialsNonExpired,
  9. boolean accountNonLocked,
  10. Collection<? extends GrantedAuthority> authorities, String salt) {
  11. super(username, password, enabled, accountNonExpired,
  12. credentialsNonExpired, accountNonLocked, authorities);
  13. this.salt = salt;
  14. }
  15. public String getSalt() {
  16. return salt;
  17. }
  18. public void setSalt(String salt) {
  19. this.salt = salt;
  20. }
  21. }

完成这里之后,还是不够的,因为重载的类只是有了这个属性,但是还是不知道如何从数据库中获取。要做到这个其实很简单,我们只需要修改myUserDetailsService中loadUserByUsername的返回值:


  1. @Override
  2. public UserDetails loadUserByUsername(String username)
  3. throws UsernameNotFoundException {
  4. Collection<GrantedAuthority> auths = new ArrayList<GrantedAuthority>();
  5. User user = null;
  6. try {
  7. user = userDao.getUserByName(username);
  8. if (user == null)
  9. throw new UsernameNotFoundException("用户" + username + "不存在!");
  10. List<String> rolenames = userDao.loadRolesByUserName(username);
  11. System.err.println("用户拥有角色有:");
  12. for (String rolename : rolenames) {
  13. SimpleGrantedAuthority authority = new SimpleGrantedAuthority(
  14. rolename);
  15. auths.add(authority);
  16. System.err.println(rolenames);
  17. }
  18. } catch (Exception e) {
  19. e.printStackTrace();
  20. }
  21. System.err.println(auths.size());
  22. boolean isEnabled = true;
  23. boolean accountNonExpired = true;
  24. boolean credentialsNonExpired = true;
  25. boolean accountNonLocked = true;
  26. if (!user.getStatus().equalsIgnoreCase("enabled")) {
  27. isEnabled = false;
  28. }
  29. return new SaltedUser(user.getUsername(), user.getPassword(),
  30. isEnabled, accountNonExpired, credentialsNonExpired,
  31. accountNonLocked, auths, user.getSalt());
  32. }

如上面红色代码部分,一看便知。

原文地址:https://blog.csdn.net/zavens/article/details/17165833

在spring security3中使用自定义的MD5和salt进行加密的更多相关文章

  1. 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  2. Spring Boot 中关于自定义异常处理的套路!

    在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @ControllerAdvice 来统一处理,也可以自己来定义异常处理方案.Spring Boot 中,对异常的处理有 ...

  3. Spring Boot中的自定义start pom

    start pom是springboot中提供的简化企业级开发绝大多数场景的一个工具,利用好strat pom就可以消除相关技术的配置得到自动配置好的Bean. 举个例子,在一般使用中,我们使用基本的 ...

  4. Spring Boot中如何自定义starter?

    Spring Boot starter 我们知道Spring Boot大大简化了项目初始搭建以及开发过程,而这些都是通过Spring Boot提供的starter来完成的.品达通用权限系统就是基于Sp ...

  5. spring项目中 通过自定义applicationContext工具类获取到applicationContext上下文对象

    spring项目在服务器启动的时候 spring容器中就已经被创建好了各种对象,在我们需要使用的时候可以进行调用. 工具类代码如下 import org.springframework.beans.B ...

  6. shiro入门学习--使用MD5和salt进行加密|练气后期

    写在前面 在上一篇文章<Shiro入门学习---使用自定义Realm完成认证|练气中期>当中,我们学会了使用自定义Realm实现shiro数据源的切换,我们可以切换成从关系数据库如MySQ ...

  7. Spring Security3中的-authentication-manager标签详解

    讲解完http标签的解析过程,authentication-manager标签解析部分就很容易理解了 authentication-manager标签在spring的配置文件中的定义一般如下 < ...

  8. 在Spring MVC 中配置自定义的类型转换器

    方法一: 实现spring mvc 自带的 Formatter 接口 1.创建一个类来实现Formatter接口 import org.springframework.format.Formatter ...

  9. 在spring boot中使用自定义的properties

    1 在application.properties中添加 android.name=Tim android.password=123456 新建一个保存该Setting的配置类, @Configura ...

随机推荐

  1. 《2019年上半年Web应用安全报告》发布:90%以上攻击流量来源于扫描器,IP身份不再可信

    Web应用安全依然是互联网安全的最大威胁来源之一,除了传统的网页和APP,API和各种小程序也作为新的流量入口快速崛起,更多的流量入口和更易用的调用方式在提高web应用开发效率的同时也带来了更多和更复 ...

  2. 深入浅出Cocoa之消息【转】

    在入门级别的ObjC 教程中,我们常对从C++或Java 或其他面向对象语言转过来的程序员说,ObjC 中的方法调用(ObjC中的术语为消息)跟其他语言中的方法调用差不多,只是形式有些不同而已. 譬如 ...

  3. 友盟iOS sdk整理

    文档中心 :http://dev.umeng.com 集成文档:http://dev.umeng.com/analytics/ios-doc/integration 报表中心:http://www.u ...

  4. js树状菜单

    html部分 <ul class="tree"> <li><span><a href="#">JavaScrip ...

  5. pl/sql基础知识—函数快速入门

    n  函数 函数用于返回特定的数据,当建立函数式,在函数头部必须包含return子句,而在函数体内必须包含return语句返回的数据,我们可以使用create function来建立函数,实际案例: ...

  6. asp.net ajax客户端框架如何调用Web Service

    asp.net ajax客户端框架如何调用Web Service 1:Web Service类添加 [System.Web.Script.Services.ScriptService]特性2:需要异步 ...

  7. Codeforces 425B

    点击打开题目链接 题意:给定一个n×m的0,1矩阵,做多可以对矩阵做k次变换,每次变换只可以将矩阵的某一个元素由0变成1,或从1变成0. 求最小的变换次数使得得到的矩阵满足:每一个连通块都是一个“实心 ...

  8. 整合Freemarker视图层和整合jsp视图层和全局捕获异常

    SpringBoot静态资源访问 1.静态资源:访问 js / css /图片,传统web工程,webapps springboot 要求:静态资源存放在resource目录下(可以自定义文件存放) ...

  9. linux驱动开发满三年,回首一下基本看不到其它选择

    刚刚搞完一个处理器BSP项目,准备搞下一个自研处理器.说不上来什么喜悦,仅仅有些许茫然.没有刚毕业时对这个行业的痴迷,慢慢认同这仅仅是个谋生工具的想法. 回忆当初编写第一个驱动,就像上了战场.被长官踢 ...

  10. CAD专用卸载修复工具,一键完全彻底卸载删除CAD软件的专用卸载工具

    Autodesk CAD卸载工具(AUTO Uninstaller)是专门为了针对Autodesk CAD软件卸载不干净而导致CAD安装失败问题进行研发的Autodesk CAD一键卸载工具.现在虽然 ...