在spring security3中使用自定义的MD5和salt进行加密
首先看代码:
-
<authentication-manager alias="authenticationManager">
-
<authentication-provider user-service-ref="myUserDetailsService">
-
<password-encoder ref="myPasswordEncode">
-
<salt-source user-property="salt"/>
-
</password-encoder>
-
</authentication-provider>
-
</authentication-manager>
-
<beans:bean id="myPasswordEncode" class="pw.bany.security.MyPasswordEncode">
-
<beans:constructor-arg name="encode" value="md5"></beans:constructor-arg>
-
</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为用户登录时提交的明文密码。
-
@Override
-
// 如果返回true,则验证通过。
-
public boolean isPasswordValid(String savePass, String submitPass,
-
Object salt) {
-
return savePass.equalsIgnoreCase(Util.MD5WithSalt(submitPass,
-
salt.toString()));
-
}
Util.MD5WithSalt(submitPass,salt.toString()),是我们的加密方法,此处没贴出源码,网上很多。这里的salt需要特别注意一下,怎么才能把数据库中的salt传过来的问题。
上面配置中使用了<salt-source user-property="salt"/>来指定salt,但是系统是怎么知道在数据库中的salt字段呢?其实这里实际上是指定了org.springframework.security.core.userdetails.User中的一个属性,但是这个类中并没有这个属性,此时,需要我们重写这个类,为该类加入salt属性。
-
package pw.bany.security;
-
-
import java.util.Collection;
-
import org.springframework.security.core.GrantedAuthority;
-
import org.springframework.security.core.userdetails.User;
-
-
public class SaltedUser extends User {
-
-
private String salt;
-
-
public SaltedUser(String username, String password, boolean enabled,
-
boolean accountNonExpired, boolean credentialsNonExpired,
-
boolean accountNonLocked,
-
Collection<? extends GrantedAuthority> authorities, String salt) {
-
super(username, password, enabled, accountNonExpired,
-
credentialsNonExpired, accountNonLocked, authorities);
-
this.salt = salt;
-
}
-
-
public String getSalt() {
-
return salt;
-
}
-
-
public void setSalt(String salt) {
-
this.salt = salt;
-
}
-
-
}
完成这里之后,还是不够的,因为重载的类只是有了这个属性,但是还是不知道如何从数据库中获取。要做到这个其实很简单,我们只需要修改myUserDetailsService中loadUserByUsername的返回值:
-
@Override
-
public UserDetails loadUserByUsername(String username)
-
throws UsernameNotFoundException {
-
Collection<GrantedAuthority> auths = new ArrayList<GrantedAuthority>();
-
User user = null;
-
try {
-
user = userDao.getUserByName(username);
-
if (user == null)
-
throw new UsernameNotFoundException("用户" + username + "不存在!");
-
List<String> rolenames = userDao.loadRolesByUserName(username);
-
System.err.println("用户拥有角色有:");
-
for (String rolename : rolenames) {
-
SimpleGrantedAuthority authority = new SimpleGrantedAuthority(
-
rolename);
-
auths.add(authority);
-
System.err.println(rolenames);
-
}
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
System.err.println(auths.size());
-
boolean isEnabled = true;
-
boolean accountNonExpired = true;
-
boolean credentialsNonExpired = true;
-
boolean accountNonLocked = true;
-
-
if (!user.getStatus().equalsIgnoreCase("enabled")) {
-
isEnabled = false;
-
}
-
-
return new SaltedUser(user.getUsername(), user.getPassword(),
-
isEnabled, accountNonExpired, credentialsNonExpired,
-
accountNonLocked, auths, user.getSalt());
-
}
如上面红色代码部分,一看便知。
原文地址:https://blog.csdn.net/zavens/article/details/17165833
在spring security3中使用自定义的MD5和salt进行加密的更多相关文章
- 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- Spring Boot 中关于自定义异常处理的套路!
在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @ControllerAdvice 来统一处理,也可以自己来定义异常处理方案.Spring Boot 中,对异常的处理有 ...
- Spring Boot中的自定义start pom
start pom是springboot中提供的简化企业级开发绝大多数场景的一个工具,利用好strat pom就可以消除相关技术的配置得到自动配置好的Bean. 举个例子,在一般使用中,我们使用基本的 ...
- Spring Boot中如何自定义starter?
Spring Boot starter 我们知道Spring Boot大大简化了项目初始搭建以及开发过程,而这些都是通过Spring Boot提供的starter来完成的.品达通用权限系统就是基于Sp ...
- spring项目中 通过自定义applicationContext工具类获取到applicationContext上下文对象
spring项目在服务器启动的时候 spring容器中就已经被创建好了各种对象,在我们需要使用的时候可以进行调用. 工具类代码如下 import org.springframework.beans.B ...
- shiro入门学习--使用MD5和salt进行加密|练气后期
写在前面 在上一篇文章<Shiro入门学习---使用自定义Realm完成认证|练气中期>当中,我们学会了使用自定义Realm实现shiro数据源的切换,我们可以切换成从关系数据库如MySQ ...
- Spring Security3中的-authentication-manager标签详解
讲解完http标签的解析过程,authentication-manager标签解析部分就很容易理解了 authentication-manager标签在spring的配置文件中的定义一般如下 < ...
- 在Spring MVC 中配置自定义的类型转换器
方法一: 实现spring mvc 自带的 Formatter 接口 1.创建一个类来实现Formatter接口 import org.springframework.format.Formatter ...
- 在spring boot中使用自定义的properties
1 在application.properties中添加 android.name=Tim android.password=123456 新建一个保存该Setting的配置类, @Configura ...
随机推荐
- window10下载安装jieba
下载安装jieba的过程如下: 1 下载jieba 2 将其解压到E:\python2,如图所示: 3 在桌面左下角搜索框中输入"运行",之后输入"cmd".再 ...
- 世界名校网络课程大盘点,美国大学CS专业十三大研究方向,世界50所知名大学提供开放课程
世界名校网络课程大盘点 加州大学伯克利分校http://webcast.berkeley.edu/ 加州大学伯克利分校与斯坦福大学. 麻省理工学院等一同被誉为美国工程科技界的学术 领袖,其常年位居 ...
- Mongodb停止和启动
mongodb开启.停止.重启操作 #开启service mongodb start#停止service mongodb stop#重启service mongodb restart
- 【风马一族_php】常用的语句
设置脚本的编码 <?php header('Content-type:text/html;charset=utf-8'); ?> 按原格式的输入内容 echo <pre>; ...
- 【风马一族_php】NO2_php基础知识
原文来自:http://www.cnblogs.com/sows/p/5995763.html (博客园的)风马一族 侵犯版本,后果自负 回顾 什么是php以及php的发展史 搭建web服务器 apa ...
- Notepad++ ssh NppFTP链接linux
Notepad++是一套非常有特色的自由软件的纯文字编辑器,有完整的中文化接口及支持多国语言编写的功能.现在用Notepad++来远程编辑Linux系统文本文件. Notepad++ 1.Linux操 ...
- C++中的union
1:,像任何类一样,union可以指定保护标记使成员成为公用的.私有的或受保护的.默认情况下,union 表现得像 struct:除非另外指定,否则 union 的成员都为 public 成员. 2: ...
- MUI - 为textarea添加语音输入和清除的功能
为textarea添加语音输入和清除的功能 mui支持input输入框语音输入和清除的功能,只需要添加相关css类即可. http://www.cnblogs.com/phillyx/ 代码如下 &l ...
- MyBatis动态批量插入、更新Mysql数据库的通用实现方案
一.业务背景 由于需要从A数据库提取大量数据同步到B系统,采用了tomikos+jta进行分布式事务管理,先将系统数据源切换到数据提供方,将需要同步的数据查询出来,然后再将系统数据源切换到数据接收方, ...
- 2019-7-20-win10-uwp-使用-msbuild-命令行编译-UWP-程序
title author date CreateTime categories win10 uwp 使用 msbuild 命令行编译 UWP 程序 lindexi 2019-07-20 21:56:2 ...