ps:这段代码是我在做项目中由于,项目本身的所谓安全机制等等一系列原因,说正题:就是我在做sso登录的时候需要拿到电脑当前的使用者,获取他的账号然后做一个sso,然后只要他一登录系统,这个系统就要获取他的账号,通过他的账户去私有域中去查他的信息,以及判定他是否存在,离职没离职,若该电脑的账号信息存在则登录成功,否则失败。然后把他的信息在经过一系列操作让用户刷新页面的时候登录要做到无感刷新,并且如果他要退出的话也是可以登录别人的账户,此时再去刷新则会刷新你第二次登陆人的账户信息,(其实这里面有一个难点就是这个电脑一旦用账号登录了,便一直是这个账号在使用,除非切换账号,然而我们的系统是不一定一直用登录该电脑的账号所登录,也允许别的账号登录。也就是我的系统做的sso可以退出登录别人的账号(非该电脑账号)),说了一大堆,我自己都蒙了,应该简单来说就是你把自己的电脑借给别人用他自己的账号等我们的系统。大概就是这么回事。也许平常没什么,但是我们gs电脑有一种恶心人的机制,就不一一讲述了。上代码:
代码语言:javascript复制 public String login(Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session)
throws IOException {String remoteHost = null;
String auth = request.getHeader("Authorization");
String username = null;
if (auth == null) {
response.setStatus(response.SC_UNAUTHORIZED);
response.setHeader("WWW-Authenticate", "NTLM");
response.flushBuffer();
return auth;
}
if (auth.startsWith("NTLM ")) {
byte[] msg = null;
try {
msg = new sun.misc.BASE64Decoder().decodeBuffer(auth.substring(5));
} catch (IOException e1) {
e1.printStackTrace();
}
int off = 0, length, offset;
if (msg[8] == 1) {
byte z = 0;
byte[] msg1 = { (byte) 'N', (byte) 'T', (byte) 'L', (byte) 'M', (byte) 'S', (byte) 'S', (byte) 'P', z,
(byte) 2, z, z, z, z, z, z, z, (byte) 40, z, z, z, (byte) 1, (byte) 130, z, z, z, (byte) 2,
(byte) 2, (byte) 2, z, z, z, z, z, z, z, z, z, z, z, z };
response.setHeader("WWW-Authenticate", "NTLM " new sun.misc.BASE64Encoder().encodeBuffer(msg1));
try {
response.sendError(response.SC_UNAUTHORIZED);
} catch (IOException e) {
e.printStackTrace();
}
} else if (msg[8] == 3) {
off = 30;
length = msg[off 17] * 256 msg[off 16];
offset = msg[off 19] * 256 msg[off 18];
remoteHost = new String(msg, offset, length);
length = msg[off 1] * 256 msg[off];
offset = msg[off 3] * 256 msg[off 2];
length = msg[off 9] * 256 msg[off 8];
offset = msg[off 11] * 256 msg[off 10];
username = new String(msg, offset, length);
username = (username == null || username.equals("")) ? ""
: username.replace(username.substring(1, 2), "");
remoteHost = (remoteHost == null || remoteHost.equals("")) ? ""
: remoteHost.replace(remoteHost.substring(1, 2), "");
String pagepath = request.getParameter("pagepath");
pagepath = pagepath == null || pagepath.equals("") ? "" : pagepath;
System.out.println(username " : ");
}
}
这是gs的一个前辈给我的算法吧 我也不是很清楚,没研究明白,好像不是很稳定,当他不稳定的时候会出现电脑管理员的账号弹框,但是这种几率渺渺,而且并不影响程序,喜欢的小伙伴可以在自己电脑上运行一下看能获取到什么神奇的鬼东西。哈哈哈哈哈哈。