sso简要介绍:
全称Single Sign On。是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分
sso原理说明:
sso需要一个独立的注册中心,只有注册中心能接受用户的用户名密码等安全信息,其他系统不提供登录入口,只接受注册中心的间接授权。即用户提供安全信息,子应用将安全信息转给注册中心,由注册中心判断登陆成功与否并将登陆结果返回给子应用,子应用进行相应的处理。具体处理见下图
注册中心:SSORegistrationCenter
主要作用:负担通行账号注册,登录验证,注销验证,提供子应用链接
使用:启动SSORegistrationCenter项目即可。
子应用:SSOClient
主要作用:负担过滤客户的登录请求,注销请求,向注册中心发送登录,验证,注销 请求。
前提:
1.依赖项目SSOClient
<dependency>
<groupId>JiangTuo</groupId>
<artifactId>SSOClient</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2.重写文件SSO.properties
3.实现接口:AddUserToSession,示例如下:
@Log4j
@Service
@SuppressWarnings("SpringJavaAutowiringInspection")
public class AddUserToSessionImpl implements AddUserToSession {
@Resource
private UserService userService;
@Override
public JsonResult AddUserToSessionByAccount(String account, HttpSession session) {
JsonResult node = new JsonResult();
UserDto userGet = userService.selectUserByPhone(account);
if (userGet != null)//可以通过手机号查询到用户
{
//获取存入的4为随机数 两次md5加密校验
String salt = userGet.getSalt();
if (userGet.getStatus() == UserAuditStatus.WAIT.getStatus()) {
node.setSuccess(false);
node.setFailReason("该账户尚未完成验证!");
return node;
}
//设置令牌(根据用户名和当前时间戳)
String currentTime = Calendar.getInstance().getTimeInMillis() + "";
String token = StringUtil.md5(userGet.getId() + currentTime);
//根据用户id更新token
User userToken = new User();
userToken.setId(userGet.getId());
userToken.setToken(token);
userToken.setLastLoginTime(Calendar.getInstance().getTime());//最后一次登录时间
userService.updateByPrimaryKeySelective(userToken);
//带有token的用户信息保存到session
userGet.setToken(userToken.getToken());
SessionUtil.setCurrentUser(session, userGet);
// logger.info("用户登录httpSession"+session.getId());
node.setSuccess(true);
node.setFailReason("登录成功");
} else {
//TODO:可以在这里增加用户插入功能,如此就完成了统一注册的功能
node.setSuccess(false);
node.setFailReason("该账户尚未注册!");
//node.put("tip", 4);
}
return node;
}
@Override
public JsonResult removeUserToSessionByAccount(HttpSession session) {
//注销操作
return null;
}
}
4.登录的前台代码:
可参考SSOClient项目的SSOlogin.jsp和SSOlogin.js
5.注销的前台代码逻辑:
(1)首先获取注册中心的所有子应用信息
地址:/getAllApp
(2)获取后进行循环请求:
地址:/ASSOLoginOutPost
统一注册的功能实现是这样的:(注)
1首先在子应用中进行注册操作,此操作逻辑由子应用掌控
2操作成功后请求注册中心的注册链接
地址:/ASSORegister
参数:account通行证账号 password通行证密码
只需要在注册中心注册成功即可。
(子应用在登录时,验证(去注册中心的令牌验证)成功后会自动将通行证插入该子应用的数据库,此处需要什么样的参数等可以等客户进入主页后另行插入:代码位置:上文中实现的接口例子代码中最后有一句TODO注释。)
目前该模块实现了统一登录功能、统一注销功能以及统一注册功能。
但是并非所有代码都集成到了模块中,需要自应用进行相应的编程支持(虽然代码量非常小)。并且数据结构以及功能都相对简单不够完善,尚待实战检验
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}