内容简介:公司老项目使用注意:项目中用到
Grails3 Spring Secuirty自定义加密方式
应用场景
公司老项目使用 grails2.0+
版本,他的加密方式为 encodeAsSHA256
,数据是通过导入实现,要兼容以前数据加密方式,使以前使用老项目的用户也能用原先的密码登录。
- 首先,我做了一下测试
def test() { map.password1 = "123456".encodeAsSHA256() map.password2 = springSecurityService.encodePassword("123456") render map as JSON }
- 结果发现他们是两种不同的加密方式
接下来只能通过重写父类方法实现统一加密
-
第一步:自定义一个类,我习惯在
src/main/goovy
下创建CustomPasswordEncoder.groovy
类,也可以创建java
类
package com.encoder import org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder import org.springframework.security.authentication.encoding.PasswordEncoderUtils import org.springframework.security.crypto.codec.Hex import org.springframework.util.Assert import java.security.MessageDigest /** * 自定义加密覆盖默认加密方式 * 项目spring-security版本为3.1.0,本可以重新BaseDigestPasswordEncoder类 * 但是本人看BaseDigestPasswordEncoder类被标记为删除了,所以通过重写MessageDigestPasswordEncoder类方法实现 */ class CustomPasswordEncoder extends MessageDigestPasswordEncoder { // 默认为MD5 private String algorithm = "MD5"; // 加密次数(提高安全) private int iterations = 1; CustomPasswordEncoder() { // 当前类默认构造器,因为父类没有空构造器,所以这里必须调用父类有参构造,这里传入参数必须是父类存在的加密规则,否则报错 super("SHA-256") } CustomPasswordEncoder(String algorithm) { super(algorithm, false); this.algorithm = algorithm } CustomPasswordEncoder(String algorithm, boolean encodeHashAsBase64) throws IllegalArgumentException { super() setEncodeHashAsBase64(encodeHashAsBase64); this.algorithm = algorithm; getMessageDigest(); } @Override String encodePassword(String rawPass, Object salt) { String saltedPass = this.mergePasswordAndSalt(rawPass, salt, false) MessageDigest messageDigest = this.getMessageDigest() byte[] digest = messageDigest.digest(saltedPass.getBytes("UTF-8")) for (int i = 1; i < iterations; i++) { digest = messageDigest.digest(digest); } // 先判断是否启用base64 if (this.getEncodeHashAsBase64()) { return new String(Base64.encodeAsBase64(digest)) // 判断是否为自定义的SHA-256-1(框架自定加密方式,非spring security框架,这里指的是grails自带的加密) } else if ("SHA-256-1".equalsIgnoreCase(algorithm)) { return rawPass.encodeAsSHA256() } else { // 使用用户配置的其他加密方式 return new String(Hex.encode(digest)) } } @Override boolean isPasswordValid(String encPass, String rawPass, Object salt) { String pass1 = "" + encPass String pass2 = encodePassword(rawPass, salt) return PasswordEncoderUtils.equals(pass1, pass2) } String getAlgorithm() { return algorithm; } void setIterations(int iterations) { Assert.isTrue(iterations > 0, "Iterations value must be greater than zero"); this.iterations = iterations; } }
-
第二步:在
grails-app/conf/spring/resources.groovy
中注册一下bean
beans = { // 自定义密码 passwordEncoder(com.encoder.CustomPasswordEncoder) { encodeHashAsBase64 = false // 若为true,则以base64方式加密 } }
-
第三步:在
grails-app/conf/application.groovy
中添加配置
// 原框架加密方式,有SHA-256、bcrypt、MD5、pbkdf2,默认为bcrypt // 自定义加密默认为MD5,这里SHA-256-1为自定义加密,还可以用SHA-256等 grails.plugin.springsecurity.password.algoritham = 'SHA-256-1'
到这里配置就已经完成了,启动测试
注意:项目中用到 domain.save(failOnError: true)
的有时需要修改为 domain.save(flush: true)
,我测试密码修改时, failOnError: true
没有修改成功。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- php实现的AES加密类定义与用法示例
- 用BurpSuit的Brida自定义插件搞定加密签名算法
- Android进阶:十三、自定义类加载器加载加密类文件
- 加密原理详解:对称式加密 VS 非对称式加密
- 编码、摘要和加密(三)——数据加密
- 聊聊对称加密与非对称加密
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Effective JavaScript
David Herman / Addison-Wesley Professional / 2012-12-6 / USD 39.99
"It's uncommon to have a programming language wonk who can speak in such comfortable and friendly language as David does. His walk through the syntax and semantics of JavaScript is both charming and h......一起来看看 《Effective JavaScript》 这本书的介绍吧!