历史版本33 :同步用户密码加密设置 返回文档
编辑时间:
内容长度:图片数:目录数:
修改原因:
1. 问题描述编辑
在平台内置进行用户身份验证的时候,密码存在数据库(FineReport内置数据库finedb或者其他数据库)中,认证时用户输入的密码与数据库中密码相同则认证通过,若数据库被破解了则对系统造成威胁,怎样保证系统安全呢?
2. 解决方案编辑
在进行手动添加用户的时候,使用密码加密功能。数据库中存的是密文,输入的密码需要进行加密才能和数据库中的密文进行匹配,加大破解难度,提高系统安全性。
3. 实现原理编辑
3.1 设置方法
登录平台,点击管理系统>用户管理>设置开启同步数据集的时候,设置加密方式,如下图:
3.2 密码加密方式分类
密码加密功能分为:内置SHA加密、自定义密码加密。
内置SHA加密:加密方式已经封装了;
自定义密码加密:需要将自定义的密码验证类(包含了加密方法)放在报表服务器如/webapps/webroot/WEB-INF/classes下,勾选自定义密码加密,并指向自定义的密码验证类。
3.3 原理
若设置了加密规则,encodePassword方法中会先对用户输入密码进行加密转换,再与数据库密码匹配。
内置SHA加密:用户输入的密码默认经过SHA加密,再和数据库中的密码进行匹配;
自定义密码加密:用户输入的密码经过自定义加密规则进行加密,再和数据库中的密码进行匹配,具体方法:String encode(String originText);//入参是明文字符,返回结果是密文字符;
自定义密码加密中,用户输入密码后提交,报表服务器会调用shouldIgnoreUsername()方法判断调用encodePassword(clientPassword)和encodePassword(String clientPassword, String clientUsername)中的哪一个密码验证方法,如果shouldIgnoreUsername()返回true(默认返回true),则调用encodePassword(clientPassword)方法,忽略用户名,如果返回false,则调用encodePassword(String clientPassword, String clientUsername),将用户名加入到密码加密中,然后再根据密码验证方法来判断数据库中密码和用户输入的匹配情况,相同返回true,否则返回false。
注:验证方法encodePassword中clientPassword为用户输入的密码,clientUsername为用户输入的用户名。
另:之前版本使用的方法为validatePassword,10.0和之前的版本不能实现向下兼容。
4. 自定义密码加密示例编辑
下面我们制作一个简单的自定义密码加密示例:实现自定义密码Base加密。
4.1 自定义密码验证类
定义一个类,命名为Base64PasswordValidator.java,扩展于AbstractPasswordValidator,具体代码如下:
package com.fr.decision.privilege.encrpt;
import com.fr.base.Base64;
import com.fr.base.ServerConfig;
import com.fr.log.FineLoggerFactory;
import java.io.UnsupportedEncodingException;
public class Base64PasswordValidator extends AbstractPasswordValidator {
public Base64PasswordValidator() {
}
public String encode(String originText) {
try {
return Base64.encode(originText.getBytes(ServerConfig.getInstance().getServerCharset()));
} catch (UnsupportedEncodingException var3) {
FineLoggerFactory.getLogger().debug(var3.getMessage());
return "";
}
}
}
将编译的Base64PasswordValidator.class放在/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege/encrpt目录下。
注:需要重启工程。
4.2 平台设置
自定义密码加密的文本框中输入的是com.fr.decision.privilege.encrpt.Base64PasswordValidator.class,设置后,密码就会进行base加密再进行登录。
注:这边是举了一个最简单的例子,您可以根据自己的需求自己定义加密的方式。