随着现在的系统越来越多(OA考勤,学生宿舍管理等等)。在使用中是不是还在为一次一次的登录而烦恼?或者忘了密码而尴尬,现在,有一个好东西来解决这个问题了。那就是单点登录。
单点登录
单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
单点登录的好处
-
提高用户的效率。 用户不再被多次登录困扰,也不需要记住多个 ID 和密码。另外,用户忘记密码并求助于支持人员的情况也会减少。
-
提高开发人员的效率。 SSO 为开发人员提供了一个通用的身份验证框架。实际上,如果 SSO 机制是独立的,那么开发人员就完全不需要为身份验证操心。他们可以假设,只要对应用程序的请求附带一个用户名,身份验证就已经完成了。
-
简化管理。 如果应用程序加入了单点登录协议,管理用户帐号的负担就会减轻。简化的程度取决于应用程序,因为 SSO 只处理身份验证。所以,应用程序可能仍然需要设置用户的属性(比如访问特权)。
单点登录的缺点
-
不利于重构 因为涉及到的系统很多,要重构必须要兼容所有的系统,可能很耗时。
-
容易出现安全问题。因为只需要登录一次,所有的授权的应用系统都可以访问,可能导致一些很重要的信息泄露。
cas 官方网址: https://www.apereo.org/projects/cas .
工程代码网址:https://github.com/Jasig/cas
阿里云cas:https://yq.aliyun.com/articles/636281
以上就是关于单点登录的介绍,下面要做的是对接:
举个栗子
看了,上面的材料,各位应该知道,现在要做的对接,就是我们这边登录成功了,和别人系统登录成功之后,效果是一样的。
所有,我们要做的就是给对面一个?service=http://xxx.xx.xx
这个是我们重定向到别人的登录之后,返回的数据的URL
没有这个,就不知道回来的路。
然后别人的系统在我们登录成功之后,要返回一个ticket
和一个targetUrl
。
ticket
是一个地址用来判断我们是不是要去别人的系统登录,targetURL
是将我们需要的数据返回给我们。
String targetUrl = CasUtils.getTargetUrl(request);
if (CasUtils.isLogin(session)) {
LoginUser loginUser = (LoginUser)session.getAttribute(Constants.LOGIN_USER_KEY);
response.sendRedirect(targetUrl);
} else {
if (CasUtils.hasTicket(request)) {
LoginUser loginUser = CasUtils.getLoginUser(request);
if (loginUser.isLogin() && dologin(loginUser, request)) {
CasUtils.login(loginUser, session);
} else {
}
} else {
String loginUrl = CasUtils.getLoginUrl(request);
response.sendRedirect(loginUrl);
}
}
/** 获取TargetUrl */
public static String getTargetUrl(HttpServletRequest request) {
String basePath = getBasePath(request);
// 获取请求中的targetUrl
String targetUrl = request.getParameter(Constants.TARGET_URL_KEY);
if (StringUtils.isEmpty(targetUrl)) {
// 若不存在,则使用默认页面作为targetUrl
targetUrl = basePath + Constants.DEF_TARGET_URI;
} else {
// 判断target是否编码
if (targetUrl.startsWith(Constants.BASE64_PREFIX)) {
targetUrl = targetUrl.substring(Constants.BASE64_PREFIX.length());
targetUrl = Base64Utils.decodeBase64Str(targetUrl);
}
}
return targetUrl;
}
/** 判断是否已经登录过 */
public static boolean isLogin(HttpSession session) {
Object isLogin = session.getAttribute(Constants.LOGIN_KEY);
return BooleanUtils.toBoolean(String.valueOf(isLogin));
}
/** 判断票据是否存在 */
public static boolean hasTicket(HttpServletRequest request) {
Object ticket = request.getParameter(Constants.TICKET_KEY);
System.out.println("ticket = " + ticket);
return ticket != null
&& !StringUtils.isEmpty(String.valueOf(ticket));
}
UML 图表
这将产生一个流程图。:
其中,targetUrl
: 里面是你要的数据。ticket
:返回的是一个票用来免登录的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)