本文只是简述单点登录解决方案,系统其他方面均省略
如上图:系统基本架构
FR与ES分为两个不同的子项目,前端请求均通过访问FR,由FR通过HttpURLConnection访问ES(赋能层),FR主要作用为登录鉴权。大致请求流程如下:
1、Password MD5单向加密成新的Password
(1) 如:localhost:8080/xxxmanager-fr/loginServlet?name=xxxx&password=123456
(2) 密码加密之后 password=asdf2jyf7q2g7hg723faklkh83;
2、根据相应规则生成请求流水号:id(如时间戳,可自定义生成规则)
(1) id = 123123123
3、id同其他参数一起进行ASSCII码排序
(1) 根据参数名进行ASCII码排序 如排序后:String param = "id = 123123123&name=xxxx&password=asdf2jyf7q2g7hg723faklkh83";
4、对所有参数进行单向加密生成sign(数字签名)
(1)加入加密密钥 KEY
比如 KEY=d2adf53jd7sha7qdkdhd127d(KEY生成规则自己定);
String param = "id = 123123123&name=xxxx&password=asdf2jyf7q2g7hg723faklkh83&key=d2adf53jd7sha7qdkdhd127d";
(2)对 字符串 param 进行单向加密生成sign(最好MD5单向加密)
比如加密后 sign= 12d6wdjdka3939yf6dd6dyw729dhey;
5、FR通过HttpURLConnection访问ES
url = localhost:8080/xxxmanager-es/loginAuth?id = 123123123&name=xxxx&password=asdf2jyf7q2g7hg723faklkh83&sign= 12d6wdjdka3939yf6dd6dyw729dhey;
6、ES收到请求之后,和以上步骤一样,取得所有参数,通过同样的加密密钥加密所有参数生成sign
(1) 请求流水号 id 由FR生成,作为参数传入ES,ES不需要自己生成
(2)根据用户名数据库查询 密码是否一样(数据库中用户密码MD5加密存储),比较密码是否一样
(2)比较FR传入的sign和ES生成的sign是否一样,一样则通过,否则返回 数字签名校验失败
(3)如果sign通过,根据用户名数据库查询 密码是否一样(数据库中用户密码MD5加密存储),比较密码是否一样
工作忙,还没写完,尽快补齐