- 浏览: 157952 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
bkk854762363:
好文章,赞
Spring3.0 + 自定义注解实现操作日志记录功能 -
怪黍叔:
学习了
Spring3.0 + 自定义注解实现操作日志记录功能 -
wellway:
请问jfreechart-1.0.11-demo.jar怎么反 ...
关于JFreeChart Demo
我对于一个新的内容学习.一般先知道其作用和特点是什么.然后从网上看下有什么例子和说明最后自己做几个符合自己需求的例子。
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时.刷新sessionJava代码
ControllerUtils utils = new ControllerUtils();
// 刷新session
utils.refreshSession();
ControllerUtils utils = new ControllerUtils();
// 刷新session
utils.refreshSession();
2.进入ControllerUtils的refreshSession()
Java代码
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();
}
}
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这个方法将是重点:
Java代码
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:单点登录.一般是系统之间整合需要解决的一个问题.例如你之前做了个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时.刷新sessionJava代码
ControllerUtils utils = new ControllerUtils();
// 刷新session
utils.refreshSession();
ControllerUtils utils = new ControllerUtils();
// 刷新session
utils.refreshSession();
2.进入ControllerUtils的refreshSession()
Java代码
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();
}
}
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这个方法将是重点:
Java代码
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);
}
}
发表评论
-
子类可以继承到父类上的注解吗?
2012-11-12 17:07 8072不了解注解基础知识的请先看《JDK 5 Annotation\ ... -
JDK 5 Annotation\注解\注释\自定义注解
2012-11-12 17:06 1521自定义注解示例 ------ ... -
Java基础知识点梳理
2012-10-16 10:50 1164... -
String考点
2012-10-08 10:37 8831.String StringBuffer StringBui ... -
抽取网页数据的不同思路
2012-09-27 18:52 0客户要求从Internet上的网页上抽取一定的数据,用来显示或 ... -
使用TransactionTemplate 编程式控制事务
2012-09-27 17:10 27964使用 TransactionTempla ... -
Java编程中的性能优化手段
2012-09-26 15:35 10691.尽量使用final修饰符。 带有final修饰符的类是不 ... -
java 异常处理
2012-09-26 15:32 9391.异常处理的流程: ① 遇到错误,方法立即结束,并不返回一个 ... -
灵活自定义缩略图片尺寸大小方案分享(nginx,lua_nginx,GraphicsMagick)
2012-07-11 12:27 3166melin 写道 在开发电子商务网站时,同一个图片需要不 ... -
jmagic 的安装与使用
2012-03-25 08:59 1700平台:winXP 1. 安装Imag ... -
单例模式
2012-03-25 08:45 1198饿汉式: package com.design.pat ... -
判断滚动条已经滚动到底部 方法收集
2011-10-17 14:17 33091.window.onscroll=function() { ... -
Spring3.0 + 自定义注解实现操作日志记录功能
2011-06-07 18:08 6361Xml代码 <aop:aspectj-autop ... -
如何在HttpServletRequest上下文环境中判断请求是同步请求还是异步请求
2011-05-05 15:01 2026在Java后台,有时候我们需要根据同步请求和异步请求做个性 ... -
跨应用程序的session共享
2010-09-30 12:36 1892常常有这样的情况,一个大项目被分割成若干小项目开发,为了能够互 ... -
Java的垃圾回收机制详解和调优
2010-09-30 11:21 9951.JVM的gc概述 gc即 ... -
单点登录系统的设计与实现方案
2010-09-30 09:26 1620目的: 对目前已有的 Web 应用系统,和将来待开发的 Web ...
相关推荐
SSO(Single Sign-On)单点登录是一种网络访问控制机制...对于理解SSO单点登录解决方案,提升企业内部系统的用户体验和安全管理具有重要价值。通过深入学习这些资料,可以掌握如何设计和实施一个高效、安全的SSO系统。
SSO单点登录技术是现代企业级应用架构中不可或缺的一部分,它通过统一的身份认证服务提升了用户体验,降低了运维复杂度。"Simple-SSO"项目为开发者提供了一个学习和实践SSO的平台,结合Maven的项目管理,使得分布式...
在“sso单点登录源代码”中,我们可以看到以下几个关键组成部分: 1. **SSOLab.sln**:这是一个Visual Studio解决方案文件,包含了整个SSO项目的所有组件。通过这个文件,开发者可以打开并管理整个项目,包括各个子...
在"SSO单点登录源码"这个主题中,我们主要关注的是如何实现这样一个系统。通过提供的链接(http://www.blogjava.net/xcp/archive/2010/04/13/318125.html),我们可以了解到SSO的基本原理和实现步骤。在这个样例中,...
SSO(Single Sign-On)单点登录是一种网络应用的认证技术,它允许用户在一个系统或应用中登录后,无需再次输入凭证即可访问其他关联的系统或应用。这大大提升了用户体验,减少了用户记忆多个密码的负担,同时也有助...
SSO(Single Sign-On)单点登录是一种身份验证机制,允许用户在一次登录后访问多个应用程序,而无需再次输入凭证。在这个"ssso单点登录demo.zip"压缩包中,包含了一个基于Spring Boot、Spring Data JPA和MySQL实现的...
这个“sso单点登录demo”是一个Java实现的示例,包含了三种不同的场景:相同域名、相同父类域名以及不同域名的SSO解决方案。 1. **相同域名的SSO** (`sso_same_domain`): 在同一域名下实现SSO,通常比较直接,因为...
通过这些知识点的学习和实践,你可以创建一个基本的SSO单点登录DEMO,为多应用环境提供便捷的身份验证方案。在实际项目中,你可能还需要根据具体需求进行扩展,比如支持OAuth、OpenID Connect等更现代的认证协议,...
单点登录(Single Sign-On,简称SSO)是一种网络身份验证技术,允许用户在一次登录后,无需再次输入凭证即可访问多个相互关联的应用系统。在IT领域,它极大地提升了用户体验和安全性,尤其对于大型企业或组织,管理...
从提供的"SSO单点登录完整代码"来看,可能包含以下内容: - IDP的实现,可能使用Java、Python或其他语言,包含用户验证逻辑和令牌生成。 - SP的实现,展示如何检查和验证来自IDP的令牌,以及如何根据令牌的验证结果...
SSO(Single Sign-On)单点登录是一...学习SSO单点登录资料,可以深入理解上述概念和技术细节,同时涵盖实际部署中的配置、集成和安全考虑。源码分析可以帮助开发者更好地理解和实现SSO系统,提高系统的可靠性和效率。
这个"java sso 单点登录 demo"可能会包含以上这些知识点的示例代码和配置,帮助开发者理解和学习如何在Java环境中搭建和实现SSO。通过研究这个Demo,你可以更深入地理解SSO的工作原理,并能在实际项目中运用。
SSO(Single Sign-On)单点登录是一种网络应用中...总结来说,SSO单点登录实例是一个学习和实践SSO技术的好材料。通过理解和运行这个Demo,你不仅能掌握SSO的基本原理,还能了解到如何在实际开发中实施和优化SSO系统。
学习SSO单点登陆很好的例子,内附源码解释。由网上收集。很值得学习。
### SSO单点登录概述与关键技术 #### 一、单点登录(Single Sign-On, SSO)的概念 单点登录是一种使用户仅需一次身份验证即可访问多个应用程序的技术。这通常应用于互相信任的系统之间,允许用户在一个系统中登录后...
标题“SSO单点登录技术”指的是这个主题将深入探讨如何实现和应用SSO,尤其是与CAS(Central Authentication Service)相关的实践。CAS是一种开放源码的身份验证框架,设计用于简化和集中管理多应用的用户认证过程。...
单点登录(Single Sign-On,简称SSO)是一种身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次输入凭证。在这个"SSO demo 单点登录"示例中,我们看到使用了SSH(Spring、Struts2、...
这个压缩包文件"SSO单点学习demo"提供了一个学习SSO技术的实践环境,包含了sso-server(服务端)、sso-oa(办公应用客户端)和sso-pro(专业应用客户端)三个关键组成部分,对于初学者来说,这是一个很好的起点。...
通过理解以上知识点,你可以根据提供的SSO项目源码学习如何在C#环境中实现单点登录功能。该项目可能包括了CAS服务器的实现、子站点的配置以及用户登录、令牌验证的逻辑。通过对这些代码的分析和实践,你将能够掌握...