业务功能开发-登录(三)
登录cookie(加密+解密)
加密登录cookie:
密码验证成功时候会生成加密用户标识写入cookie中,根据登录页面中的是否自动登录,确定cookie的有效生命周期是-1还是初始化文件中配置的有效时间。在init.properties有cookie的有效时间配置,默认配置是15天
首先就是确定cookie的声明周期,并根据用户登录的当前时间,用户ID,用户IP,User-Agent拼接成一串标识,然后使用IDEA加密方式,生成一串登录的密文写入cookie,这个加密过程是可逆的,可以根据加密密钥进行解密。
在init.properties有密钥的配置,这个密钥可以更换,但是在项目上线之后就不要随意更换了,如果有用户选择了自动登录,那么解密就会失败,这样就需要做验证失败重新登录的处理
在ToolIDEA.java中main方法有生成示例
public static void main() throws Exception {
String inputStr = "IDEA";
byte[] inputData = inputStr.getBytes();
System.err.println("原文:\t" + inputStr);
// 初始化密钥
byte[] key = initKey();
System.err.println("密钥:\t" + Base64.encodeBase64String(key));
// 加密
inputData = encrypt(inputData, key);
System.err.println("加密后:\t" + Base64.encodeBase64String(inputData));
// 解密
byte[] outputData = decrypt(inputData, key);
String outputStr = new String(outputData);
System.err.println("解密后:\t" + outputStr);
}
为了保证线上产品的安全,大家在自己的项目中最好是自己重新生成一遍,把输出的密钥替换为config,sercurityKey现有的密钥
AuthInterceptor中加密登录用户信息并写入cookie的setCurrentUser方法,大家可以根据注释的步骤来消化代码
public static void setCurrentUser(HttpServletRequest request, HttpServletResponse response, User user, boolean autoLogin) {
// 1.设置cookie有效时间
int maxAgeTemp = -1;
if (autoLogin) {
maxAgeTemp = PropKit.getInt(ConstantInit.config_maxAge_key);
}
// 2.设置用户名到cookie
ToolWeb.addCookie(response, "", "/", true, "userName", user.getStr("username"), maxAgeTemp);
// 3.生成登陆认证cookie
String userIds = user.getPKValue();
String ips = ToolWeb.getIpAddr(request);
String userAgent = request.getHeader("User-Agent");
long date = ToolDateTime.getDateByTime();
StringBuilder token = new StringBuilder();// 时间戳.#.USERID.#.USER_IP.#.USER_AGENT.#.autoLogin
token.append(date).append(".#.").append(userIds).append(".#.").append(ips).append(".#.").append(userAgent).append(".#.").append(autoLogin);
String authmark = ToolIDEA.encrypt(token.toString());
// 4. 添加到Cookie
ToolWeb.addCookie(response, "", "/", true, ConstantWebContext.cookie_authmark, authmark, maxAgeTemp);
}