我对于一个新的内容学习.一般先知道其作用和特点是什么.然后从网上看下有什么例子和说明最后自己做几个符合自己需求的例子。
SSO:单点登录.一般是系统之间整合需要解决的一个问题.例如你之前做了个BBS或者一个CMS的系统.你在完成一个全新系统时候需要用到BBS这个系统的话..你就可能面临一个整合的问题.(除非你自己决定从新做个BBS上去) 对于我们已有的WEB应用中的用户,若该用户已经登陆,并通过 联结迁移到BBS页面时,BBS要能够识别该用户已经登陆(不需要二次登陆)才不会让用户感到别扭(对用户来说,就好像使用的是同一个系统似的)。
下面看下Jforum对于SSO的处理.
首先找到SSO处理所有类:net.jforum.sso下的SSO(需要实现的接口) SSOUtils(工具类)类;net.jforum.ControllerUtils;net.jforum.JForum
首先从xml中可以看到net.jforum.JForum这是整个系统一个核心的servlet.所以所有访问将通过该实体类
1.当一个用户访问JForum时.刷新session
ControllerUtils utils = new ControllerUtils();
// 刷新session
utils.refreshSession();
2.进入ControllerUtils的refreshSession()
public void refreshSession()
{
UserSession userSession = SessionFacade.getUserSession();//获取系统用户session
RequestContext request = JForumExecutionContext.getRequest();//获取封装后的request值
if (userSession == null) {//如果userSession不存在话
userSession = new UserSession();
userSession.registerBasicInfo();//初始化基础信息
userSession.setSessionId(request.getSessionContext().getId());
userSession.setIp(request.getRemoteAddr());
SessionFacade.makeUnlogged();//清除登录session的值
if (!JForumExecutionContext.getForumContext().isBot()) {//如果不是机器登录
// Non-SSO authentications can use auto login
/**
* 要启用sso功能话需要配置SystemGlobals.properties的中
* authentication.type的值=ConfigKeys.TYPE_SSO
*/
if (!ConfigKeys.TYPE_SSO.equals(SystemGlobals.getValue(ConfigKeys.AUTHENTICATION_TYPE))) {
if (SystemGlobals.getBoolValue(ConfigKeys.AUTO_LOGIN_ENABLED)) {
this.checkAutoLogin(userSession);
}
else {
userSession.makeAnonymous();
}
}
else {
this.checkSSO(userSession);//检测sso
}
}
SessionFacade.add(userSession);//将userSession设置到SessionFacade
}
else if (ConfigKeys.TYPE_SSO.equals(SystemGlobals.getValue(ConfigKeys.AUTHENTICATION_TYPE))) {//是否启用sso
SSO sso;
try {
/**
* ConfigKeys.SSO_IMPLEMENTATION
* 取决你用什么方式实现SSO 可以是Cookies形式或者JDAP等形式而相应完成的实现类需要在SystemGlobals.properties配置 sso.implementation = 实现类完整路径
*/
sso = (SSO) Class.forName(SystemGlobals.getValue(ConfigKeys.SSO_IMPLEMENTATION)).newInstance();
}
catch (Exception e) {
throw new ForumException(e);
}
// If SSO, then check if the session is valid
if (!sso.isSessionValid(userSession, request)) {//session值是否通过SSO验证.
SessionFacade.remove(userSession.getSessionId());
refreshSession();
}
}
else {
SessionFacade.getUserSession().updateSessionTime();
}
}
从代码中可以看出.checkSSO这个方法将是重点:
protected void checkSSO(UserSession userSession)
{
try {
/**
* ConfigKeys.SSO_IMPLEMENTATION
* 中对应SystemGlobals.properties配置中SSO的实现类
* 取决你用什么方式实现SSO
* 可以是Cookies形式或者JDAP等形式 sso.implementation = 实现类完整路径
*/
SSO sso = (SSO) Class.forName(SystemGlobals.getValue(ConfigKeys.SSO_IMPLEMENTATION)).newInstance();
/**
* sso检测用户.返回为用户的值
*/
String username = sso.authenticateUser(JForumExecutionContext.getRequest());
/**
* 若返回了一个null,则设置为“Anonymous” (设置匿名用户)
* checkAutoLogin()将调用makeAnonymous()里面设置的匿名cookies值
* 若一个“Anonymous”用户试图访问权限以外的页面,
* JForum将根据SSO的设置导航到登陆页面,
* 同时传递给一个登陆成功后应该迁移到的地址参数给login页面。
*/
if (username == null || username.trim().equals("")) {
userSession.makeAnonymous();
}
/**
* 若返回了一个不为空的username时,
* JForum将会检查是否匹配JForum数据库的userid。
* 若没有匹配的userid,JForum将动态加以创建
*
*/
else {
SSOUtils utils = new SSOUtils();
if (!utils.userExists(username)) {//如果用户不存在进行添加
SessionContext session = JForumExecutionContext.getRequest().getSessionContext();
String email = (String) session.getAttribute(SystemGlobals.getValue(ConfigKeys.SSO_EMAIL_ATTRIBUTE));
String password = (String) session.getAttribute(SystemGlobals.getValue(ConfigKeys.SSO_PASSWORD_ATTRIBUTE));
if (email == null) {
email = SystemGlobals.getValue(ConfigKeys.SSO_DEFAULT_EMAIL);
}
if (password == null) {
password = SystemGlobals.getValue(ConfigKeys.SSO_DEFAULT_PASSWORD);
}
utils.register(password, email);//JForum设置该user为登陆状态
}
this.configureUserSession(userSession, utils.getUser());
}
}
catch (Exception e) {
e.printStackTrace();
throw new ForumException("Error while executing SSO actions: " + e);
}
}
上面只是小弟的一些理解.希望高手可以提点下..
SSO这个接口提供了2个方法 对于自己的需求进行相应SSO技术选择
技术选择有可以看下:
http://blog.163.com/anly_liu/blog/static/42832314200810212619493/
下面可能整理一下做个符合自己的例子出来(使用cookies来实现)
分享到:
相关推荐
sso 单点登录资料 学习资料源码
sso单点登录(整理的学习文档),可能对你学习单点登录有帮助。
主要介绍了基于JWT实现SSO单点登录流程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
关于sso单点登录的学习记录,sso客户端和服务器相关代码
学习SSO单点登陆很好的例子,内附源码解释。由网上收集。很值得学习。
sso单点登录demo 适合入门学习 4个小程序之间实现单点登录功能
sso单点demo,包含sso服务端和两个sso客户端,对学习sso入门很有帮助
基于Spring Boot、Mybatis、Redis的SSO单点登录系统demo,内含一个母系统,2个子测试系统,也可以当成整合demo来学习
包含两个单点登录的例子,自己收藏学习
一个简单的单点登录实例,提供完整的项目demo源码,实现过程简单易懂,如有更简洁方式?请大家相互学习,不喜勿喷!
基于spring security oauth2 实现的SSO单点登录案例,本案例非常完整,值得用于参考学习spring+security+oauth2
基于spring security oauth2 实现的SSO单点登录案例,本案例非常完整,值得用于参考学习spring security oauth2
这是一个比较不错的sso单点登录的Demo例子,同时进行了比较详细的请求时序图的分析和绘制,供大家学习,分享给大家,绝对干货!!!
花费几个小时的时间,给需要学习的人员学习使用,希望能帮助到你们。
主要介绍了Spring Security基于JWT实现SSO单点登录详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
SSO单点登陆,包中有文有例子!供学习参考!
注:图中代码段仅作为思路理解 直接copy当然是不可以的喔">关于SSO的思路 csdn和cnblog中都有许多大牛给出了解释 此图是在学习了 韩星 的 基于 Net的单点登录 SSO 解决方案 基础上做的个人总结(顺序图) 小弟初探 ...
一个用于学习或演示的SSO单点登录系统Demo,基于java web(jsp+servlet),不涉及数据库及其他框
适合入门级微服务初学者学习解决方案 针对博客学习,nacos sentinel及redis和API网关Gateway针对sso单点登录进行学习
XXL-SSO 是一个分布式单点登录框架。只需要登录一次就可以访问所有相互信任的应用系统。 其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码,开箱即用。