最近在做一个学校的项目,需要提供给上海交通大学学生和老师使用,所以需要使用jAccount登录

jAccount简介

【详情看这里】

jAccount认证体系是上海交通大学网络信息中心开发的用户认证体系。网络信息中心为每个注册的交大校园网用户提供了一个统一的网络账户,称为 jAccount

然后jAccount里面包含的信息如下

checkLogin 返回的Hashtable中包含了该用户的一些属性,包括:

属性名 属性值
uid 账号名(指jAccount)
student yes:学生/no:教职员工/team:集体帐号/outside:校外用户/postphd:博士后/alumni:校友
id 工号/学号
dept 部门/院系
chinesename 姓名

吐槽:这些属性我也是醉了,用户的身份居然用student用 yes/no…来表示。然后dept字段是院系以及部门信息,但这些数据居然是文字信息直接是人手动改的!

后来,我发现更让我震惊的事情就是堂堂交大,所有学生信息居然没有一个准确可靠的来源!比较准确的来源也有这么多信息未更新或者已经错误了。


回到正题

  1. jAccount基于Base64进行加密和解密,所以需要先导入相关依赖

  2. 想要使用jAccount来做认证,首先需要去一些部门盖章,步骤相当繁琐,此处省略1W字。申请完成之后会有一些资料包括jaccount key 和 secret当然还有一个开发包jaman.jar

  3. 把key文件放在webapp/jakey文件夹下(可放置在别处)

  4. 好像这样就可以了。。。

jaccount的原理简单分析

参考文档中有这样的示例代码:

1
2
3
4
5
6
JAccountManager jam = new JAccountManager("jacw110330", getServletContext().getRealPath("/"));// 创建JAccountManager对象
Hashtable ht = jam.checkLogin(request, response, session, request.getRequestURI());//checkLogin时做一些重定向
if (ht !=null && jam.hasTicketInURL) {
jam.redirectWithoutTicket(response);
return;
}

JAccountManager.checkLogin里面做三个步骤的check

  1. hasValidTicket,检查url参数 jatkt(其中含userProfile的hashtable)
  2. isSiteCookieValid,检查JASiteCookie 是否存在 (其中也含userProfile的hashtable)
  3. 重定向到jaccount登录页面
  4. 登录后返回到 jam.checkLogin() 提供的returnUrl上

如果是基于token验证的应用,这里拿到学生信息之后可以进行匹配并生成token返回。

登出

jam提供一个logout函数,但调用之后还是有点儿问题,cookie清除不对,研究了几天了还是没结果… 下次如果记得会补上,这个问题必须修的。