- 浏览: 408432 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (268)
- java (22)
- Acegi (8)
- Ajax (17)
- Annotation (3)
- Ant (3)
- JBOSS (6)
- Xdoclet (1)
- CSS (20)
- Data Warehouse (11)
- DB2 (3)
- DOM (1)
- dos (2)
- JMF (1)
- JMS (5)
- J2EE (17)
- Hibernate (7)
- struts (10)
- CORBA (1)
- 职业 (2)
- JSF (1)
- JSTL (8)
- 其它 (1)
- Log4j (7)
- svg (7)
- quartz (3)
- web2.0 (2)
- velocity (2)
- apache commons (1)
- js (9)
- html (4)
- sql (3)
- linux (4)
- dwr (14)
- spring (5)
- GWT (7)
- portlet (4)
- 软件工程 (10)
- actionscript (1)
- 测试 (1)
- tomcat (3)
- flash (0)
- 线程 (1)
- mysql (6)
- flex (1)
- oracle (7)
- crystalreport (4)
- itext (4)
- memcache (2)
- linux 监控 (2)
- mongodb (1)
- Kafka (5)
- 网络 (2)
- 分布式计算 (2)
最新评论
-
chenyongxin:
mark
JBoss 4.0.2集群基本知识及配置方法指南 -
softor:
我找到了,下载吧:http://ishare.iask.sin ...
jad是最简单的class反编译为java文件的小工具 (转载) -
softor:
求下载
dodo@lovehang.com
jad是最简单的class反编译为java文件的小工具 (转载) -
juedui0769:
不错!
请问: 如何在 将 log4j.appender ...
Tomcat 日志 配置 (转载) -
spp_1987:
// 建立一个上传文件的输出流
...
Struts上传多个及N个文件的例子
Portal开发 1、WebLogic Portal的portlet开发步骤
Q: 能不能用portal administration来管理已经在workshop中创建好的portal和在这个创建好的portal上的内容,在无需创建新的portal的条件。也就是说原来portal不变,但是可以管理原来portal 中的部分内容。能不能实现??行还是不行???为什么??
A: weblogic portal完整的开发过程有两个步骤:一在workshop中进行portlet和相关资源的开发,二、在admin tools中以此为基础进行组装
2、在workshop 中怎样让portlet使用新建的*.jpf
直接将你新建的JPF拖放到你的portal页面上,就直接生成了jpf的portlet了
3、如何在weblogic portal中配置calender portlet
使用weblogic portal中的例子,需要完成以下步骤:
1。按照帮助系统中关于sample 的使用方法的提示将相应的文件import进自己的工程中。
2。在你安装weblogic的时候有目录\bea\weblogic81\portal\db\pointbase\44下有一个文件sample_portal_create_tables.sql在pointbase里面执行它。
3。需要将web.xml中的相应配置拷入到你的web.xml中如果你按照上面的步骤执行,就没有问题了。
4、如何把header.jsp和footer.jsp拖到相应的位置
在portal8.1可head和footed位置是由shell文件控制的,你可以为一个desktop选择一个shell文件,比如samportal中缺省的为header
FooterVisitor.shell
:
<?xml version="1.0" encoding="UTF-8"?>
<netuix:markupDefinition xmlns:netuix="http://www.bea.com/servers/netuix/xsd/controls/netuix/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bea.com/servers/netuix/xsd/controls/netuix/1.0.0 markup-netuix-1_0_0.xsd">
<netuix:locale language="en"/>
<netuix:markup>
<netuix:shell
title="Header-Footer Visitor Shell" description="A header with a link and footer is included in this shell." markupType="Shell" markupName="headerFooterVisitor">
<netuix:head/>
<netuix:body>
<netuix:header>
<netuix:jspContent contentUri="/portlets/header/header.jsp"/>
</netuix:header>
<netuix:break/>
<netuix:footer/>
</netuix:body>
</netuix:shell>
</netuix:markup>
</netuix:markupDefinition>5、在Portal 7.0中怎样在usermgt.jar中指向一个新生成EntityPropertyManager
修改ejb-jar.xml and weblogic-ejb-jar.xml.
在ejb-jar.xml中添加;
<ejb-ref>
<ejb-ref-name>ejb/LdapPropertyManager</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>com.bea.p13n.property.EntityPropertyManagerHome</home>
<remote>com.bea.p13n.property.EntityPropertyManager</remote>
</ejb-ref>
在weblogic-ejb-jar.xml也作对应的修改就可以了
在http://dev2dev.bea.com/codelibrary/code/unified_up.jsp有一wlp7.0的例子你可以看看
6、请问workshop开发的portlet是否能移植到websphere portal上?
bea portal支持jsr-168,如果用jsr-168写portal移植应该没问题,但是很多是用java page flow,估计要等到标准化以后才能移植
7、Portal与Portlet中的Session与Request
Q: 在编写Portlet的时候,如果用session.setAttribute(),这个变量可以在各个Portlet中共享,有没有办法能够让session局限与一个portlet之内,也就是在一个portlet的页面流中,我如何传递自己的参数,别的portlet又看不到。request也是同样
A: session本来就是用来在一段回话中共享数据得,你这样的要求似乎太为难大家伙了。实在不行就在session中设定标志位区别吧;request的话,好像本来就是可以的吧,看看这个:
<%@page import="com.bea.wlw.netui.pageflow.scoping.ScopedServletUtils"%>
<%
HttpServletRequest outerRequest = ScopedServletUtils.getOuterRequest( request );
%>
8、关于SSO和Weblogic Portal
本文讨论的只是基于Web的其他应用系统与的Weblogic Portal的SSO。
一、应用系统的验证
提到SSO,就不能不提到其他基于Web应用系统的身份验证。我们透过现象看本质,看看基于Web的身份验证的实质是什么。
无论后端是什么系统,例如Lotus Domino,BO等等,其实,基于Web的身份验证的实质无外乎就是有一个表单(FORM),表单里面让用户输入用户名称和密码,然后提交给验证的页面(Form中的action指定的),通过身份验证后,通过Session来储存用户的一些信息,然后每次访问页面时,从session里面读这些信息,如果存在,则进入登录后的界面,否则,就认为没有登录。
而Session的机制呢,我想大多数人都应该知道,它是与Domain还有Path相关的,是存储在服务器端的,服务器如何知道当前浏览器或者客户端对应的是哪个Session呢,主要是通过Cookie中的sessionid来对应的,session是有失效时间的,服务器一般都可以设置,也可以通过程序来设置。
Cookie的生命周期可以是一关闭浏览器就灭亡,也可以设置存在的时间,如果设置了存在的时间,就会以文件的方式存在于客户端,当客户端再访问服务器时,可以通过Domain对应关系从Cookie中读取相应的信息,一般我们在其他网站时,登录时如果设置了自动登录或者记录多长时间,就是使用的Cookie,一般会在Cookie中存储登录的用户名称和密码的密文,访问网站时,它如果读取到这些信息,就会使用这些信息自动登录了。
所以可以看出,无论对于什么Web应用程序,如果该浏览器曾经登录过,服务器端生成了session,客户端Cookie中记录了SessionID,该浏览器没有关闭,那么,即便该浏览器访问其他的站点后,再回到该应用系统,如果Session没有失效,那么应用程序还会认为你是登录的。
而对于身份验证的页面,一般是不做判断,判断你的用户名称和密码是通过POST,还是URL中参数方式提交的。除此以外,有的应用程序会从URL中参数判断你是否登录,这种方式由于不安全目前已经应用不多,早些年很多门户网站的邮件就是这种机制,用户登录时会根据一些特性生成一个很长的字符串,通过该字符串来判断是否登录了,所以当时会发生,如果在另外一台机器上拷贝了该URL,也会进入邮箱的情况。
还有一种特殊情况,这是HTTP协议支持的,就是BASIC认证方式,它会在用户初次访问时弹出对话框,用户输入用户名和密码后,浏览器会记住,然后每次HTTP请求时,在Header里面将用户名称和密码的BASE64位形式传给服务器,服务器就会知道该用户的身份了,之所以在这里单独提出这种方式,是因为下文介绍的自己编写的SSO实现很难对付这种验证方式,所以,如果后端系统(例如Lotus Domino)同时也支持Form身份验证,就需要改过来,如果不支持或者不能改过来,将是很棘手的一件事情。
二、SSO的实现-第三方产品
本节讨论的是基于第三方产品实现SSO。
目前,有很多产品支持SSO,使用Weblogic Portal,我们也主张用户使用这些产品,因为他们能够很好的通过配置,甚至是自学习的方式实现SSO,开发者需要完成的工作很少。
这些产品,一般实现的方式有两类:第一类是通过Agent的方式,即在后端每个Web应用系统,或者其他系统都安装一个Agent,由Agent来接管该系统的身份验证和访问控制,同时,需要有一台策略服务器,里面会放置Weblogic Portal的用户信息,以及这些用户与其他系统的用户对应信息,当然,Weblogic Portal也可以继续保留自己的用户,该策略服务器只是存放了用户的对应关系。这类产品对于不同的系统,Agent不同,这些Agent能够通过配置,轻松的接管了后面的系统的身份验证和访问控制,所以,举例来说,如果Portal中用户A对应系统1中的用户B,那么策略服务器中有此配置后,当从Portal访问系统1时,系统1的agent能够辨别portal用户A,就可以知道该系统对应的用户是B,让系统认为当前用户就是B,然后使用B的身份来访问和操作系统1。这类产品的使用方式还可以是,通过一个统一的LDAP,存放企业内部的用户信息,然后通过策略服务器,控制了后端所有系统的URL访问权限,这样也实现了单点登录。
这种方式的优点是:策略服务器不会存储其他系统的密码,密码还是保存在各个系统中,同时,各个系统的访问都由Agent控制,用户必须经过Portal作为入口,同时,可以通过策略服务器灵活的配置访问控制。缺点在于:需要在各个系统安装Agent;对于没有Agent的系统,需要通过安装Web Agent,然后进行一定的编码实现;Portal作为单一入口,一旦当机,无法访问后台系统。缺点解决:Weblogic Portal可以通过构建集群实现负载均衡和容错,避免单点故障。
第二类是通过Proxy的方式,即具有一个Proxy Server,由它来接管对于后端系统的访问,提交请求和读取数据,然后再返回给Portal,同时也有一个LDAP服务器或者策略服务器,该服务器可以存放用户信息以及用户的对应关系。Proxy Server的作用是接收Portal的请求,提交给后端系统,然后将返回的数据再写给Portal,Proxy Server会通过存储的用户对应关系和用户名和密码,自动完成后端系统的登录,然后就象一个浏览器一样,提取数据,返回数据给后端系统。
该方法的优点是:后端系统不用做任何改动。即便是没有Portal,其他系统还可以照常使用。缺点是:需要在策略服务器中存储用户名称和密码,密码会多处存放,同步困难;用户可以绕开Portal,直接访问后端系统。Proxy Server可能是单点故障。
缺点解决:目前有密码同步产品;Proxy Server也大多支持集群。
由以上两种方式可以看出,哪种方式的编程量都不是很大,大多可以通过配置来实现,而且功能也很强大,例如第一节说的BASIC登录方式,这些产品都支持。而Weblogic Portal通过其支持多身份验证提供者,以及良好的开发框架等的特点,能够完全支持这两种方式。如果客户银子大把,优先应该考虑使用第三方产品。
可是如果客户预算不大,后端系统又不多,有什么解决方法呢?答案当然是有,但不是万能的。
三、Weblogic Portal的用户
提到SSO,就不能不说说Weblogic Portal的用户信息。作为一个统一,简单,可扩展的企业级应用平台Weblogic Platform中的一部分,Weblogic Portal被容纳在Weblogic Platform统一的安全框架中,它使用的用户和组,就是weblogic Server的用户和组,但是与Weblogic Server不同的是,它的角色是Portal特有的,与Server是完全不同意义的,需要注意不要混淆了。
Weblogic Server安装后缺省时是使用自带的内嵌的LDAP来进行用户,组和角色的管理的,在身份验证提供者中,有一个DefaultAuthenticator,就是对这部分用户,组和角色来进行管理的提供者。
Weblogic Portal8.1.3可以支持多个用户身份验证提供者,配置是在Server的控制台中进行,在Weblogic Portal的管理工具中,在管理用户和组的时候,可以在多个安全提供者之间切换,进行管理。
在Weblogic Server控制台中,点击Security > Realms > myrealm> Authentication Providers,可以看到DefaultAuthenticator,同时,还能看到可以新建很多种类的身份验证提供者,包括:
Configure a new Default Identity Asserter...
Configure a new MedRec Sample Authenticator...
Configure a new Open LDAPAuthenticator...
Configure a new Novell Authenticator...
Configure a new iPlanet Authenticator...
Configure a new RDBMSAuthenticator...
Configure a new Default Authenticator...
Configure a new Realm Adapter Authenticator...
Configure a new WSRPIdentity Asserter...
Configure a new LDAPX509Identity Asserter...
Configure a new Active Directory Authenticator...
可以看到,Weblogic Server可以配置使用多种主流的LDAP服务器来存储用户和组,同时,也支持数据库和AD。通过设置,可以指定使用哪个身份验证提供者作为缺省的。也可以设置多个Provider直接的验证关系如何。
本文中不会对如何配置进行说明,感兴趣的朋友,可以查阅Weblogic Server关于Security的相关的帮助。使用数据库作为验证,可以参见笔者另外一个帖子:
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=101&threadID=18563
由此可以看到,如果客户需要的SSO指的就仅仅是,能够使用他们企业内部已有的LDAP或者AD用户,进行Weblogic Portal登录和身份验证的话,那么,只要配置多个身份验证提供者就可以了,就可以使用那些已经存在的用户。但是,如果客户需要的SSO并不局限于此,还需要在Portal上登录以后,再访问其他一些基于Web的应用系统时,就不需要重复输入用户名和密码和重复登录了,那么,仅仅通过配置是无法实现的。即便那些系统和Portal理想状态下都使用相同的LDAP或者AD用户,由于每个系统验证用户是否登录以后的机制不同,还是需要进行定制开发的。
四、自己开发实现SSO
Portal作为统一的入口,将其他基于Web的应用集成到Portal中,方式可以是多种多样的,最简单的是Portal上提供链接,直接打开其他系统的界面,进行操作;再复杂一点的就是通过Frame或者Iframe的方法,将其他系统的界面嵌入到Portal中,但实质还是使用其他系统的界面,Portal只是从大范围(例如包含了其他应用的Portlet)来控制用户的访问权限,这两种主要解决的就是能够绕过其他系统的登录,然后让其他系统能够识别当前用户的对应身份,至于其他系统内部自己的个性化,权限等,还是由各个系统自己控制的。Weblogic Portal的Web应用集成还有其他方式,例如通过web clipping的方式,生成Portlet;或者通过HttpControl,取得Http回应的内容,组成Portlet;或者完全使用后端系统的API,重构Web内容,例如通过Lotus Domino的API,访问Lotus Domino的数据库,直接读取视图或者文档的信息等。但这几种方式都已经不再使用原来的系统界面,所以,涉及的内容在本文SSO讨论中没有包括。本节讨论的就是开始时提到的两种方式如何解决。
经过前面身份验证,Session,Cookie等方面的说明,我想,很多人大概已经知道如何自己编写程序来实现简单的SSO了,在论坛上笔者也看到有的朋友这样做了,其实说来很简单:
1、在数据库或者LDAP中存储Portal用户和其他系统用户的对应关系,包括其他系统用户名称和密码,根据不同系统的验证特点,有的可能还要存储密码的密文形式。
2、在Portal登录时,或者在切换到其他系统时,通过Iframe将用户名称和密码通过URL传递过去,进行后端的登录。
以后端系统为Dev2dev.bea.com.cn为例,可以通过查看登录页面的源文件,知道Form的action是login.jspa,那么,当Portal用户验证正确以后,可以在页面中加入
<iframe width=1 height=1 src='http://dev2dev.bea.com.cn/bbs/login.jspa?username=YOURUSERNAME&password=YOURPASSWORD'></iframe>
<a href="http://dev2dev.bea.com.cn/bbs/settings!default.jspa">Dev2dev.bea.com.cn</a>
将上面的YOURUSERNAME和YOURPASSWORD替换为Portal用户对应的用户名称和密码,打开页面后,点击该链接,可以看到,当前用户已经是登录以后的身份。
当然,可以去掉下面的连接,直接设置iframe的width和height为足够大,就可以将dev2dev.bea.com包括在其中。
以上应该是一个JSP页面(因为你要动态的设置名称和密码),通过该JSP页面产生Portlet,就可以嵌入到Portal中,正如我们前面所说,你不能通过Portal控制你登录以后的样式,个性化等属性,但是你可以通过控制用户访问该Portlet的权限,从而实现Portal内高层次的个性化和显示控制。(其实,通过JavaScript,也完全可以改变Iframe中的内容和样式,这个超出本文的主题,略过)
以上就是一个SSO的自己编程的简单实现,但是,这种方法具有很多需要注意的地方和局限性:
1、对方的登录表单,可能不仅仅是传递了用户名称和密码,可能还有其他的参数,需要多次尝试,如果能够看到对方验证的代码最好。
2、对方有可能进行了Form是POST还是GET提交的判断(例如,验证页面是Servlet),如果一定需要使POST,那么可以使iframe中src是一个相同的form表单,action指向对方的验证页面,然后,通过Javascript,进行隐式提交;更有甚者,有的验证页面还判断了是否是本服务器提交的请求,那么,就要嵌入对方的登录表单,然后在iframe所在的页面内,通过Javascript使iframe内的页面提交,完成登录。
3、有的系统为了安全,密码传输前已经在客户端通过Javascript进行了加密,注意检查。
4、有的系统很特别,一定要在浏览器的_top窗口中进行验证,或者验证以后在_top中打开后继的页面,对于这种系统,请修改对方的程序,否则很难解决。笔者曾经就遇见过此类案例,尝试多次无果,幸好后来发现对方系统能够设置后继的页面,将后继的页面设置为Portal,再转回Portal才可以。
5、Portal用户会和多个系统的用户有对应关系,需要设计一个好的数据结构,如果后端系统为多个,不一定非要在Portal登录验证后隐式登录所有的系统,可以在需要显示哪个系统时,再隐式登录。
五、小结
以上就是个人关于SSO和Weblogic Portal的实现的一些看法,经验和心得体会,希望能对相关朋友有所帮助。值得一提的是,Weblogic Portal通过Portlet源的多样性和灵活性,为自己开发编程实现SSO,提供了强有力的支持。
9、Weblogic Portal8.1中实现分页显示
我们现在至少有三种以上的方案可以解决:
1、在JSP页面上用netui:anchor 来实现页面到action的跳转,在action中进行处理之后,在回到本页面。
2、如果将代码写到JSP中,我们可以通过取得当前的page的com.bea.portlet.PostbackURL 来进行定位。
3、参考workshop中由Control自动创建的JPF中的实现方式。
第一种方案思路如下:
页面流开始,在Action中取出所有要显示的数据,分页,并显示第一页。当在jsp中点击第二页时,页面流回到Action,在Action中首先得到页数,然后计算第二页应该load的数据,并load这些数据,然后跳向原先的jsp,但是在这个jsp中绑定的数据已经是第二页的数据了。
代码详见:testpageflow
第二种方案思路:
<%
PostbackURL url = PostbackURL.createPostbackURL(request, response);
int i = 1;
while(i<10)
{
url.removeParameter("page");
url.addParameter("page",new Integer(i).toString());
%>
<a href=<%=url%>>第<%=i%>页</a>
<%
i++;
}
%>
当jsp,自己调用自己的时候,url地址不要写文件名,而是利用portlet的类,根据当前环境(request & response)先创建一个url,然后跳转到这个url,置于不同页需要不同的参数(page)值,则在代码中使用url. addParameter方法,注意在add之前最好先清一下Parameter,否则可能加得很长。
代码详见:pageTest.jsp
Java page flow 是基于strus的,建议将逻辑代码都写到action中,使用workshop提供的NetUI,一般的功能都可以实现。在jsp中尽量不写代码,尽量不要jsp之间直接跳转。
以上两个例子您可以直接拖入您的工程,可以直接运行。形成portlet放入portal后也测试过了。
第三种方案思路:参考workshop中由Control自动创建的JPF中的实现方式。
Q: 能不能用portal administration来管理已经在workshop中创建好的portal和在这个创建好的portal上的内容,在无需创建新的portal的条件。也就是说原来portal不变,但是可以管理原来portal 中的部分内容。能不能实现??行还是不行???为什么??
A: weblogic portal完整的开发过程有两个步骤:一在workshop中进行portlet和相关资源的开发,二、在admin tools中以此为基础进行组装
2、在workshop 中怎样让portlet使用新建的*.jpf
直接将你新建的JPF拖放到你的portal页面上,就直接生成了jpf的portlet了
3、如何在weblogic portal中配置calender portlet
使用weblogic portal中的例子,需要完成以下步骤:
1。按照帮助系统中关于sample 的使用方法的提示将相应的文件import进自己的工程中。
2。在你安装weblogic的时候有目录\bea\weblogic81\portal\db\pointbase\44下有一个文件sample_portal_create_tables.sql在pointbase里面执行它。
3。需要将web.xml中的相应配置拷入到你的web.xml中如果你按照上面的步骤执行,就没有问题了。
4、如何把header.jsp和footer.jsp拖到相应的位置
在portal8.1可head和footed位置是由shell文件控制的,你可以为一个desktop选择一个shell文件,比如samportal中缺省的为header
FooterVisitor.shell
:
<?xml version="1.0" encoding="UTF-8"?>
<netuix:markupDefinition xmlns:netuix="http://www.bea.com/servers/netuix/xsd/controls/netuix/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bea.com/servers/netuix/xsd/controls/netuix/1.0.0 markup-netuix-1_0_0.xsd">
<netuix:locale language="en"/>
<netuix:markup>
<netuix:shell
title="Header-Footer Visitor Shell" description="A header with a link and footer is included in this shell." markupType="Shell" markupName="headerFooterVisitor">
<netuix:head/>
<netuix:body>
<netuix:header>
<netuix:jspContent contentUri="/portlets/header/header.jsp"/>
</netuix:header>
<netuix:break/>
<netuix:footer/>
</netuix:body>
</netuix:shell>
</netuix:markup>
</netuix:markupDefinition>5、在Portal 7.0中怎样在usermgt.jar中指向一个新生成EntityPropertyManager
修改ejb-jar.xml and weblogic-ejb-jar.xml.
在ejb-jar.xml中添加;
<ejb-ref>
<ejb-ref-name>ejb/LdapPropertyManager</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>com.bea.p13n.property.EntityPropertyManagerHome</home>
<remote>com.bea.p13n.property.EntityPropertyManager</remote>
</ejb-ref>
在weblogic-ejb-jar.xml也作对应的修改就可以了
在http://dev2dev.bea.com/codelibrary/code/unified_up.jsp有一wlp7.0的例子你可以看看
6、请问workshop开发的portlet是否能移植到websphere portal上?
bea portal支持jsr-168,如果用jsr-168写portal移植应该没问题,但是很多是用java page flow,估计要等到标准化以后才能移植
7、Portal与Portlet中的Session与Request
Q: 在编写Portlet的时候,如果用session.setAttribute(),这个变量可以在各个Portlet中共享,有没有办法能够让session局限与一个portlet之内,也就是在一个portlet的页面流中,我如何传递自己的参数,别的portlet又看不到。request也是同样
A: session本来就是用来在一段回话中共享数据得,你这样的要求似乎太为难大家伙了。实在不行就在session中设定标志位区别吧;request的话,好像本来就是可以的吧,看看这个:
<%@page import="com.bea.wlw.netui.pageflow.scoping.ScopedServletUtils"%>
<%
HttpServletRequest outerRequest = ScopedServletUtils.getOuterRequest( request );
%>
8、关于SSO和Weblogic Portal
本文讨论的只是基于Web的其他应用系统与的Weblogic Portal的SSO。
一、应用系统的验证
提到SSO,就不能不提到其他基于Web应用系统的身份验证。我们透过现象看本质,看看基于Web的身份验证的实质是什么。
无论后端是什么系统,例如Lotus Domino,BO等等,其实,基于Web的身份验证的实质无外乎就是有一个表单(FORM),表单里面让用户输入用户名称和密码,然后提交给验证的页面(Form中的action指定的),通过身份验证后,通过Session来储存用户的一些信息,然后每次访问页面时,从session里面读这些信息,如果存在,则进入登录后的界面,否则,就认为没有登录。
而Session的机制呢,我想大多数人都应该知道,它是与Domain还有Path相关的,是存储在服务器端的,服务器如何知道当前浏览器或者客户端对应的是哪个Session呢,主要是通过Cookie中的sessionid来对应的,session是有失效时间的,服务器一般都可以设置,也可以通过程序来设置。
Cookie的生命周期可以是一关闭浏览器就灭亡,也可以设置存在的时间,如果设置了存在的时间,就会以文件的方式存在于客户端,当客户端再访问服务器时,可以通过Domain对应关系从Cookie中读取相应的信息,一般我们在其他网站时,登录时如果设置了自动登录或者记录多长时间,就是使用的Cookie,一般会在Cookie中存储登录的用户名称和密码的密文,访问网站时,它如果读取到这些信息,就会使用这些信息自动登录了。
所以可以看出,无论对于什么Web应用程序,如果该浏览器曾经登录过,服务器端生成了session,客户端Cookie中记录了SessionID,该浏览器没有关闭,那么,即便该浏览器访问其他的站点后,再回到该应用系统,如果Session没有失效,那么应用程序还会认为你是登录的。
而对于身份验证的页面,一般是不做判断,判断你的用户名称和密码是通过POST,还是URL中参数方式提交的。除此以外,有的应用程序会从URL中参数判断你是否登录,这种方式由于不安全目前已经应用不多,早些年很多门户网站的邮件就是这种机制,用户登录时会根据一些特性生成一个很长的字符串,通过该字符串来判断是否登录了,所以当时会发生,如果在另外一台机器上拷贝了该URL,也会进入邮箱的情况。
还有一种特殊情况,这是HTTP协议支持的,就是BASIC认证方式,它会在用户初次访问时弹出对话框,用户输入用户名和密码后,浏览器会记住,然后每次HTTP请求时,在Header里面将用户名称和密码的BASE64位形式传给服务器,服务器就会知道该用户的身份了,之所以在这里单独提出这种方式,是因为下文介绍的自己编写的SSO实现很难对付这种验证方式,所以,如果后端系统(例如Lotus Domino)同时也支持Form身份验证,就需要改过来,如果不支持或者不能改过来,将是很棘手的一件事情。
二、SSO的实现-第三方产品
本节讨论的是基于第三方产品实现SSO。
目前,有很多产品支持SSO,使用Weblogic Portal,我们也主张用户使用这些产品,因为他们能够很好的通过配置,甚至是自学习的方式实现SSO,开发者需要完成的工作很少。
这些产品,一般实现的方式有两类:第一类是通过Agent的方式,即在后端每个Web应用系统,或者其他系统都安装一个Agent,由Agent来接管该系统的身份验证和访问控制,同时,需要有一台策略服务器,里面会放置Weblogic Portal的用户信息,以及这些用户与其他系统的用户对应信息,当然,Weblogic Portal也可以继续保留自己的用户,该策略服务器只是存放了用户的对应关系。这类产品对于不同的系统,Agent不同,这些Agent能够通过配置,轻松的接管了后面的系统的身份验证和访问控制,所以,举例来说,如果Portal中用户A对应系统1中的用户B,那么策略服务器中有此配置后,当从Portal访问系统1时,系统1的agent能够辨别portal用户A,就可以知道该系统对应的用户是B,让系统认为当前用户就是B,然后使用B的身份来访问和操作系统1。这类产品的使用方式还可以是,通过一个统一的LDAP,存放企业内部的用户信息,然后通过策略服务器,控制了后端所有系统的URL访问权限,这样也实现了单点登录。
这种方式的优点是:策略服务器不会存储其他系统的密码,密码还是保存在各个系统中,同时,各个系统的访问都由Agent控制,用户必须经过Portal作为入口,同时,可以通过策略服务器灵活的配置访问控制。缺点在于:需要在各个系统安装Agent;对于没有Agent的系统,需要通过安装Web Agent,然后进行一定的编码实现;Portal作为单一入口,一旦当机,无法访问后台系统。缺点解决:Weblogic Portal可以通过构建集群实现负载均衡和容错,避免单点故障。
第二类是通过Proxy的方式,即具有一个Proxy Server,由它来接管对于后端系统的访问,提交请求和读取数据,然后再返回给Portal,同时也有一个LDAP服务器或者策略服务器,该服务器可以存放用户信息以及用户的对应关系。Proxy Server的作用是接收Portal的请求,提交给后端系统,然后将返回的数据再写给Portal,Proxy Server会通过存储的用户对应关系和用户名和密码,自动完成后端系统的登录,然后就象一个浏览器一样,提取数据,返回数据给后端系统。
该方法的优点是:后端系统不用做任何改动。即便是没有Portal,其他系统还可以照常使用。缺点是:需要在策略服务器中存储用户名称和密码,密码会多处存放,同步困难;用户可以绕开Portal,直接访问后端系统。Proxy Server可能是单点故障。
缺点解决:目前有密码同步产品;Proxy Server也大多支持集群。
由以上两种方式可以看出,哪种方式的编程量都不是很大,大多可以通过配置来实现,而且功能也很强大,例如第一节说的BASIC登录方式,这些产品都支持。而Weblogic Portal通过其支持多身份验证提供者,以及良好的开发框架等的特点,能够完全支持这两种方式。如果客户银子大把,优先应该考虑使用第三方产品。
可是如果客户预算不大,后端系统又不多,有什么解决方法呢?答案当然是有,但不是万能的。
三、Weblogic Portal的用户
提到SSO,就不能不说说Weblogic Portal的用户信息。作为一个统一,简单,可扩展的企业级应用平台Weblogic Platform中的一部分,Weblogic Portal被容纳在Weblogic Platform统一的安全框架中,它使用的用户和组,就是weblogic Server的用户和组,但是与Weblogic Server不同的是,它的角色是Portal特有的,与Server是完全不同意义的,需要注意不要混淆了。
Weblogic Server安装后缺省时是使用自带的内嵌的LDAP来进行用户,组和角色的管理的,在身份验证提供者中,有一个DefaultAuthenticator,就是对这部分用户,组和角色来进行管理的提供者。
Weblogic Portal8.1.3可以支持多个用户身份验证提供者,配置是在Server的控制台中进行,在Weblogic Portal的管理工具中,在管理用户和组的时候,可以在多个安全提供者之间切换,进行管理。
在Weblogic Server控制台中,点击Security > Realms > myrealm> Authentication Providers,可以看到DefaultAuthenticator,同时,还能看到可以新建很多种类的身份验证提供者,包括:
Configure a new Default Identity Asserter...
Configure a new MedRec Sample Authenticator...
Configure a new Open LDAPAuthenticator...
Configure a new Novell Authenticator...
Configure a new iPlanet Authenticator...
Configure a new RDBMSAuthenticator...
Configure a new Default Authenticator...
Configure a new Realm Adapter Authenticator...
Configure a new WSRPIdentity Asserter...
Configure a new LDAPX509Identity Asserter...
Configure a new Active Directory Authenticator...
可以看到,Weblogic Server可以配置使用多种主流的LDAP服务器来存储用户和组,同时,也支持数据库和AD。通过设置,可以指定使用哪个身份验证提供者作为缺省的。也可以设置多个Provider直接的验证关系如何。
本文中不会对如何配置进行说明,感兴趣的朋友,可以查阅Weblogic Server关于Security的相关的帮助。使用数据库作为验证,可以参见笔者另外一个帖子:
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=101&threadID=18563
由此可以看到,如果客户需要的SSO指的就仅仅是,能够使用他们企业内部已有的LDAP或者AD用户,进行Weblogic Portal登录和身份验证的话,那么,只要配置多个身份验证提供者就可以了,就可以使用那些已经存在的用户。但是,如果客户需要的SSO并不局限于此,还需要在Portal上登录以后,再访问其他一些基于Web的应用系统时,就不需要重复输入用户名和密码和重复登录了,那么,仅仅通过配置是无法实现的。即便那些系统和Portal理想状态下都使用相同的LDAP或者AD用户,由于每个系统验证用户是否登录以后的机制不同,还是需要进行定制开发的。
四、自己开发实现SSO
Portal作为统一的入口,将其他基于Web的应用集成到Portal中,方式可以是多种多样的,最简单的是Portal上提供链接,直接打开其他系统的界面,进行操作;再复杂一点的就是通过Frame或者Iframe的方法,将其他系统的界面嵌入到Portal中,但实质还是使用其他系统的界面,Portal只是从大范围(例如包含了其他应用的Portlet)来控制用户的访问权限,这两种主要解决的就是能够绕过其他系统的登录,然后让其他系统能够识别当前用户的对应身份,至于其他系统内部自己的个性化,权限等,还是由各个系统自己控制的。Weblogic Portal的Web应用集成还有其他方式,例如通过web clipping的方式,生成Portlet;或者通过HttpControl,取得Http回应的内容,组成Portlet;或者完全使用后端系统的API,重构Web内容,例如通过Lotus Domino的API,访问Lotus Domino的数据库,直接读取视图或者文档的信息等。但这几种方式都已经不再使用原来的系统界面,所以,涉及的内容在本文SSO讨论中没有包括。本节讨论的就是开始时提到的两种方式如何解决。
经过前面身份验证,Session,Cookie等方面的说明,我想,很多人大概已经知道如何自己编写程序来实现简单的SSO了,在论坛上笔者也看到有的朋友这样做了,其实说来很简单:
1、在数据库或者LDAP中存储Portal用户和其他系统用户的对应关系,包括其他系统用户名称和密码,根据不同系统的验证特点,有的可能还要存储密码的密文形式。
2、在Portal登录时,或者在切换到其他系统时,通过Iframe将用户名称和密码通过URL传递过去,进行后端的登录。
以后端系统为Dev2dev.bea.com.cn为例,可以通过查看登录页面的源文件,知道Form的action是login.jspa,那么,当Portal用户验证正确以后,可以在页面中加入
<iframe width=1 height=1 src='http://dev2dev.bea.com.cn/bbs/login.jspa?username=YOURUSERNAME&password=YOURPASSWORD'></iframe>
<a href="http://dev2dev.bea.com.cn/bbs/settings!default.jspa">Dev2dev.bea.com.cn</a>
将上面的YOURUSERNAME和YOURPASSWORD替换为Portal用户对应的用户名称和密码,打开页面后,点击该链接,可以看到,当前用户已经是登录以后的身份。
当然,可以去掉下面的连接,直接设置iframe的width和height为足够大,就可以将dev2dev.bea.com包括在其中。
以上应该是一个JSP页面(因为你要动态的设置名称和密码),通过该JSP页面产生Portlet,就可以嵌入到Portal中,正如我们前面所说,你不能通过Portal控制你登录以后的样式,个性化等属性,但是你可以通过控制用户访问该Portlet的权限,从而实现Portal内高层次的个性化和显示控制。(其实,通过JavaScript,也完全可以改变Iframe中的内容和样式,这个超出本文的主题,略过)
以上就是一个SSO的自己编程的简单实现,但是,这种方法具有很多需要注意的地方和局限性:
1、对方的登录表单,可能不仅仅是传递了用户名称和密码,可能还有其他的参数,需要多次尝试,如果能够看到对方验证的代码最好。
2、对方有可能进行了Form是POST还是GET提交的判断(例如,验证页面是Servlet),如果一定需要使POST,那么可以使iframe中src是一个相同的form表单,action指向对方的验证页面,然后,通过Javascript,进行隐式提交;更有甚者,有的验证页面还判断了是否是本服务器提交的请求,那么,就要嵌入对方的登录表单,然后在iframe所在的页面内,通过Javascript使iframe内的页面提交,完成登录。
3、有的系统为了安全,密码传输前已经在客户端通过Javascript进行了加密,注意检查。
4、有的系统很特别,一定要在浏览器的_top窗口中进行验证,或者验证以后在_top中打开后继的页面,对于这种系统,请修改对方的程序,否则很难解决。笔者曾经就遇见过此类案例,尝试多次无果,幸好后来发现对方系统能够设置后继的页面,将后继的页面设置为Portal,再转回Portal才可以。
5、Portal用户会和多个系统的用户有对应关系,需要设计一个好的数据结构,如果后端系统为多个,不一定非要在Portal登录验证后隐式登录所有的系统,可以在需要显示哪个系统时,再隐式登录。
五、小结
以上就是个人关于SSO和Weblogic Portal的实现的一些看法,经验和心得体会,希望能对相关朋友有所帮助。值得一提的是,Weblogic Portal通过Portlet源的多样性和灵活性,为自己开发编程实现SSO,提供了强有力的支持。
9、Weblogic Portal8.1中实现分页显示
我们现在至少有三种以上的方案可以解决:
1、在JSP页面上用netui:anchor 来实现页面到action的跳转,在action中进行处理之后,在回到本页面。
2、如果将代码写到JSP中,我们可以通过取得当前的page的com.bea.portlet.PostbackURL 来进行定位。
3、参考workshop中由Control自动创建的JPF中的实现方式。
第一种方案思路如下:
页面流开始,在Action中取出所有要显示的数据,分页,并显示第一页。当在jsp中点击第二页时,页面流回到Action,在Action中首先得到页数,然后计算第二页应该load的数据,并load这些数据,然后跳向原先的jsp,但是在这个jsp中绑定的数据已经是第二页的数据了。
代码详见:testpageflow
第二种方案思路:
<%
PostbackURL url = PostbackURL.createPostbackURL(request, response);
int i = 1;
while(i<10)
{
url.removeParameter("page");
url.addParameter("page",new Integer(i).toString());
%>
<a href=<%=url%>>第<%=i%>页</a>
<%
i++;
}
%>
当jsp,自己调用自己的时候,url地址不要写文件名,而是利用portlet的类,根据当前环境(request & response)先创建一个url,然后跳转到这个url,置于不同页需要不同的参数(page)值,则在代码中使用url. addParameter方法,注意在add之前最好先清一下Parameter,否则可能加得很长。
代码详见:pageTest.jsp
Java page flow 是基于strus的,建议将逻辑代码都写到action中,使用workshop提供的NetUI,一般的功能都可以实现。在jsp中尽量不写代码,尽量不要jsp之间直接跳转。
以上两个例子您可以直接拖入您的工程,可以直接运行。形成portlet放入portal后也测试过了。
第三种方案思路:参考workshop中由Control自动创建的JPF中的实现方式。
相关推荐
中国移动Portal协议分析的Wireshark插件,可分析CMCC Portal协议。使用方法:1)将cmccportal.lua放到wireshark的安装根目录,2)修改wireshark根目录下的init.lua,在文件最后增加dofile(DATA_DIR.."cmccportal.lua...
《NC65portal开发文档》是一份针对NC65平台的开发者手册,旨在为软件工程师提供详尽的指导,帮助他们理解和开发基于NC65portal的应用程序。NC65portal是一个集成了多种功能的Web应用平台,专为满足企业级业务需求而...
1. 统一身份认证(Single Sign-On, SSO):Portal系统通常需要集成多个不同的应用系统,SSO技术使得用户只需一次登录即可访问所有关联的应用,提高了用户体验。 2. 个性化(Personalization):Portal可以根据用户...
【Portal开发详解】 Portal开发是构建企业级门户系统的关键技术,它旨在整合各种信息资源,提供统一的访问入口,以提升用户体验和工作效率。在本文中,我们将深入探讨Portal开发涉及的多个方面,包括核心概念、关键...
【用友UAP的Portal开发】是针对企业级Web应用的一种解决方案,旨在提供一个集成了多种功能和服务的统一入口。UAP Portal是基于JSR 286规范,遵循J2EE技术体系,具备强大的系统集成和组装能力。它不仅支持产品展示...
### H3C IMC Portal 认证操作手册关键知识点解析 #### 一、Portal认证概述 **Portal认证**,在英语中意为“入口”,在IT领域特指一种通过Web页面来验证用户身份的方式,以此实现对用户网络访问权限的控制。在采用...
四、开发过程 1. **规划**:确定门户的目标、内容、用户群体和功能需求。 2. **设计**:创建页面布局,定义portlet,设置权限和角色。 3. **开发**:编写portlet代码,使用JDeveloper进行调试和测试。 4. **部署**...
- **Portal概述**:Portal认证,即Web认证,是一种基于Web页面的身份验证机制。它通过强制未认证用户登录到特定站点(门户站点)来进行身份验证。用户在门户站点完成认证后才能访问互联网资源。 - **Portal扩展功能...
#### 四、WebLogic Portal 开发实例 为了更好地理解WebLogic Portal的开发流程,下面将详细介绍一个简单的开发实例: 1. **需求分析**: 明确门户应用的目标用户群、主要功能需求等。 2. **设计阶段**: 根据需求...
【标题】:“WebSphere Portal开发手册” WebSphere Portal是一款由IBM公司提供的企业级门户平台,它允许组织构建、集成和管理各种Web应用和内容,提供个性化的访问体验。本开发手册将深入探讨如何利用WebSphere ...
根据提供的文件信息,我们可以整理出以下关于Portal开发学习的技术要求,这些内容对于希望从事或提升在Portal开发领域技能的学习者非常有用。 ### Portal开发基础知识 #### 1. Java 应用开发基础 - **Java**: Java...
- 掌握Java和Web开发基础:Portal开发通常基于J2EE平台,熟悉Java和Web开发是必要的。 - 研究标准和框架:JSR 168/286规范、Portlet API,以及流行的开源Portal框架如Liferay。 - 实践项目:参与或创建实际的...
PageBuilder 在 WebSphere Portal 7 中发挥了至关重要的作用,不仅极大地提高了门户页面的定制性和灵活性,还使得非技术人员也能参与到门户开发中来。通过深入了解 PageBuilder 的特性和最佳实践,开发者能够更高效...
在这个开发实例中,我们将深入探讨四个Liferay Portal MVC(Model-View-Controller)应用的实践案例,这些实例可以帮助开发者更好地理解如何在Liferay环境中进行portlet开发。 首先,让我们了解MVC模式在Liferay中...
**Liferay Portal 开发大全** Liferay Portal 是一个开源的企业级门户平台,广泛用于构建复杂的Web应用程序和企业内部协作系统。它提供了丰富的功能,包括内容管理、社交媒体集成、工作流支持以及用户界面定制。本...
### Portal-for-ArcGIS应用模板使用及开发 #### 一、初识Portal应用程序 ##### Web端 **Web制图** Portal for ArcGIS 支持Web端应用开发,这类应用程序通常具备独立的URL,便于用户访问。它们主要通过JavaScript...
### Liferay Portal 开发指南知识点概述 #### 一、简介 **Liferay Portal** 是一款功能强大的企业级门户平台,支持多种应用集成和技术扩展。它不仅提供了丰富的特性满足企业日常需求,同时也支持高度定制化开发。...