1. 问题描述编辑
在平台内置进行 用户身份验证 的时候,密码存在数据库(FineReport 内置数据库 FineDB 或者其他数据库)中,认证时用户输入的密码与数据库中密码相同则认证通过,若数据库被破解了则对系统造成威胁,怎样保证系统安全呢?
2. 解决方案编辑
在进行 同步用户 的时候,使用密码加密功能。数据库中存的是密文,输入的密码需要进行加密才能和数据库中的密文进行匹配,加大破解难度,提高系统安全性。
3. 实现原理编辑
3.1 设置方法
登录平台,点击管理系统>用户管理>设置开启同步数据集的时候,设置加密方式,如下图所示:
3.2 密码加密方式分类
密码加密功能分为:内置 SHA 加密、自定义密码加密。
内置 SHA 加密:加密方式已经封装了;
自定义密码加密:需要将自定义的密码验证类(包含了加密方法)放在报表服务器如/webapps/webroot/WEB-INF/classes下,勾选自定义密码加密,并指向自定义的密码验证类。
3.3 原理
若设置了加密规则,encodePassword 方法中会先对用户输入密码进行加密转换,再与数据库密码匹配。
内置 SHA 加密:用户输入的密码默认经过SHA加密,再和数据库中的密码进行匹配;
自定义密码加密:用户输入的“密码”或“用户名和密码”经过自定义加密规则进行加密,再和数据库中的信息进行匹配,支持 2 个接口实现方法,如下:
1)只需要对密码进行加密得到密文:String encode(String originText);//入参是明文密码,对密码进行加密得到密文
2)对用户名和密码进行加密得到密文:String encode(String originUserName, String originPassword);//入参是用户名和明文密码,返回结果是密文字符
注:其中 String encode(String originUserName, String originPassword);加密方式为 2019.1.18 新增的接口,包含接口1的功能,推荐使用此接口。
4. 自定义密码加密示例编辑
下面我们制作三个简单的自定义密码加密示例:实现自定义密码 BASE64 加密、SHA256、MD5 加密。
4.1 BASE64 加密方式
4.1.1 自定义密码验证类
定义一个类,命名为 Base64PasswordValidator.java,扩展于 AbstractPasswordValidator,详细的代码参见:
编译获得 Base64PasswordValidator.class,将编译的 Base64PasswordValidator.class 放在/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege/encrpt目录下。
注:这里使用 String encode(String originText);//只对密码进行加密得到密文。
注:需要重启工程。
4.1.2 平台设置
在平台的用户同步数据集>加密方式>自定义加密类中选择 BASE64 加密类即可,如下图所示:
注:这边是举了一个最简单的例子,您可以根据自己的需求自己定义加密的方式。
4.2 SHA256 加密方式
4.2.1 自定义密码加密类
定义一个类,命名为 CustomSHA256PasswordValidator.java,扩展于 AbstractPasswordValidator,详细的代码参见:
同上,编译获得 CustomSHA256PasswordValidator.class
将编译的CustomSHA256PasswordValidator.class放在/webapps/webroot/WEB-INF/classes/com/fr/decision/privilege/encrpt目录下。
注:这里使用 String encode(String originUserName, String originPassword);//对用户名和密码一起进行加密得到密文。
4.2.2 平台设置
同 BASE64 加密方式,在平台的用户同步数据集>加密方式>自定义加密类中选择 SHA256 加密类即可。
4.3 MD5 加密方式
9.0 及以前的版本,同步数据集中密码可以选择“内置 MD5 加密”,而在 FR10.0 中取消了默认的 MD5 加密。
若用户的工程是 9.0 升级到 10.0 的,而在升级之前用户同步采用的是默认内置 MD5 加密或者用户就想使用 MD5 加密方式,又该如何处理呢?
4.3.1 下载 MD5 加密类
现提供现成的 MD5 加密类 ,点击下载之后,将类放于%FR_HOME%\webroot\WEB-INF\classes\com\fr\decision目录下
4.3.2 平台设置
在平台的用户同步数据集>加密方式>自定义加密类中选择 MD5 加密类即可,如下图所示:
4.3.3 支持用户名加密
若用户需要的是【用户名+密码】的方式进行自定义加密,请使用文件:decision.zip,使用方法同上。
4.3.4 注意事项
9.0 版本 FineReport 内置的 MD5 加密方式不区分密文大小写,10.0 版本 FineReport适配的 MD5 加密方式区分大小写。
9.0 同步选择内置 MD5 加密,升级后会内置一个小写 MD5 的 class,如果是大写密文,升级后就不能登录,需要手动替换大写 class,使用方法同上。
class 文件点击下载:MD5UpperCasePasswordValidator.rar