2005年10月13日

用Yale CAS Server 来实现单点登陆(SSO)

CAS (Central Authentication Service)是Yale大学的ITS开发的一套JAVA实现的开源
的SSO(single sign-on)的服务。

这里用一个简单的例子来说明用CAS来实现单点登陆(SSO)。

Yale CAS Server 的配置过程

CAS (Central Authentication Service)是Yale大学的ITS开发的一套JAVA实现的开源
的SSO(single sign-on)的服务。该服务是以一个java web app(eg:cas.war)来进行服务的,
使用时需要将cas.war发布到一个servlet2.3兼容的服务器上,并且服务器需要支持SSL,
在需要使用该服务的其他服务器(客户),只要进行简单的配置就可以实现SSO了。

CAS 的客户端可以有很多种,因为验证的结果是以XML的格式返回的,CAS的客户端已
打包进去的有java,perl,python,asp,apache module等好几种客户端示例,你还可以根据
需要实现一个自己的客户端,非常简单!~

下面我们以tomcat 5.0 作为CAS Server(server1),另外一台tomcat5.0 为client(client1)
为例进行说明。

1.下载cas-server和cas-client(可选,建议使用)
http://www.yale.edu/tp/cas/cas-server-2.0.12.zip
http://www.yale.edu/tp/cas/cas-client-2.0.11.zip

2.将cas-server-2.0.12.zip解压,并将lib/cas.war拷贝到server1的webapps下

3.产生SERVER的证书
keytool -genkey -alias my-alias-name -keyalg RSA -keystore keystore-file

4.在server1配置tomcat使用HTTPS

$CATALINA_HOME/conf/server.xml里

<Connector className="org.apache.coyote.tomcat5.CoyoteConnector"
port="8443" minProcessors="5" maxProcessors="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" debug="0" scheme="https"
secure="true">
<Factory className="org.apache.coyote.tomcat5.CoyoteServerSocketFactory"
keystoreFile="/path/to/your/keystore-file"
keystorePass="your-password" clientAuth="false" protocol="TLS" />
</Connector>

5.在要使用CAS的客户端client1里设置(以servlets-examples这个APP为例),我们使用
ServletFilter(CAS client里提供的)来实现SSO的检查。

修改servlets-examples/WEB-INF/web.xml

<filter>
<filter-name>CASFilter</filter-name>
<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
<param-value>https://your.cas.server.name(eg:server1):port/cas/login</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://your.cas.server.name(eg:server1):port/cas/proxyValidate</param-value>
</init-param>

<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>your.client.server.name(eg:client1):port</param-value>
</init-param>

</filter>

<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>

6.将cas-client-2.0.11.zip解压,把java/lib/casclient.jar拷贝到client1服务器上的
webapps/servlets-examples/WEB-INF/lib目录下(如果没有就建一个)

7.导出SERVER的证书,用来给所有需要用到的客户端导入
keytool -export -file myserver.cert -alias my-alias-name -keystore keystore-file

8.在客户端的JVM里导入信任的SERVER的证书(根据情况有可能需要管理员权限)
keytool -import -keystore $JAVA_HOME/jre/lib/security/cacerts -file myserver.cert -alias my-alias-name

9.test & done.
把server1和client1分别起来,检查启动的LOG是否正常,如果一切OK,就访问
http://client1:8080/servlets-examples/servlet/HelloWorldExample
系统会自动跳转到一个验证页面,随便输入一个相同的账号,密码,严正通过之后就会访问
到真正的HelloWorldExample这个servlet了

更多信息请参考
http://www.yale.edu/tp/cas/
http://www-106.ibm.com/developerworks/web/library/wa-singlesign/


文章来源:http://www.livejournal.com/users/minggo/1571.html

posted @ 2005-10-13 15:08 Buddha 阅读(1268) 评论(0) 编辑

hjt79的csdnBlog上有轻量级工作流引擎的设计实现

文章来源:http://spaces.msn.com/members/jewer91/Blog/cns!1p6udCMYMrSYD0M1VOX6N3VQ!123.entry

posted @ 2005-10-13 13:47 Buddha 阅读(264) 评论(0) 编辑

1.字符串函数:contain('Welcome','e'):字符串包含,包含:true,不包含:false
                     concat('Welcome ', Name, '!'):字符连接
                     substring-before(string, pattern)
                     substring-after(string, pattern)
                     tarts-with(string, pattern)
                     substring(string, i, len?)
                     string-length(string)
                     translate(string, from-pattern, to-pattern)
                     大小写转换:translate(“Hello”, “ABCDEFGHIJKLMNOPQRSTUVWXYZ”,
                                                            “abcdefghijklmnopqrstuvwxyz”);
2.布尔运算:<         >     =    <=       >=       !=
         &lt;    &gt;    =   &lt;=    &gt;=    !=
3.算术运算:+, -, *, div, mod
   算术函数:sum(node set)  this function sums up all the values in the set of nodes
                  floor(number) returns the largest integer that is not greater than number
                                      Example.  floor(2.5) returns 2
                  ceiling(number) returns the smallest integer that is not less than number
                                      Example.  Ceiling(2.5) returns 3
                  round(number) returns the integer closest to number
                                      Example. round(2.3) returns 2


文章来源:http://spaces.msn.com/members/jewer91/Blog/cns!1p6udCMYMrSYD0M1VOX6N3VQ!125.entry

posted @ 2005-10-13 13:47 Buddha 阅读(117) 评论(0) 编辑

1。position() mode 2 
例:Coloring alternate rows
<TABLE border="1" width="25%">
        <xsl:for-each select="/FitnessCenter/Member">
                  <TR>
                          <xsl:if test="position() mod 2 = 0">
                                <xsl:attribute name="bgcolor">yellow</xsl:attribute>
                          </xsl:if>
                          <TD><xsl:value-of select="Name"/></TD>
                   </TR>
         </xsl:for-each>
</TABLE>
2。Dument(url) :指向外部另一个Xml文档
<xsl:variable name="fitnessCenter2"
                select="document('file://localhost/xml-course/.../FitnessCenter2.xml')"/>
        <xsl:for-each select="$fitnessCenter2/FitnessCenter/Member">
3。<xsl:call-template
例:使用带参数(param)的模板(template)
<xsl:template match="/">
        <HTML>
            <HEAD>
                <TITLE>Fitness Center</TITLE>
            </HEAD>
            <BODY>
                <xsl:call-template name="displayNameWithFont">
                    <xsl:with-param name="fontFace" select="'Impact'"/>
                    <xsl:with-param name="name"
                            select="/FitnessCenter/Member[1]/Name"/>
                </xsl:call-template>
                <BR/>
                ...
            </BODY>
        </HTML>
    </xsl:template>
    <xsl:template name="displayNameWithFont">
        <xsl:param name="fontFace" select="'Braggadocio'"/> <!-- default font -->
        <xsl:param name="name"/>
        <FONT face="{$fontFace}">
            <xsl:value-of select="$name"/>
        </FONT>
    </xsl:template>
使用带参数的模板例二:
<xsl:template match="/">
        <HTML>
            <HEAD>
                <TITLE>Fitness Center</TITLE>
            </HEAD>
            <BODY>
                16 / 2 =
                <xsl:variable name="result">
                    <xsl:call-template name="NumDiv2">
                         <xsl:with-param name="N" select="16"/>
                    </xsl:call-template>
                </xsl:variable>
                <xsl:value-of select="$result"/>
            </BODY>
        </HTML>
    </xsl:template>
    <xsl:template name="NumDiv2">
        <xsl:param name="N"/>
        <xsl:value-of select="$N div 2"/>
    </xsl:template>

文章来源:http://spaces.msn.com/members/jewer91/Blog/cns!1p6udCMYMrSYD0M1VOX6N3VQ!126.entry

posted @ 2005-10-13 13:47 Buddha 阅读(134) 评论(0) 编辑

1xml文件中理指令:

<?xml-stylesheet type="text/xsl" href="FitnessCenter.xsl"?>

 

2xslt根元素

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

                version="1.0">

 

3出到属性:

3.1快速用法:

无效:<Body bgcolor="<xsl:value-of select='/FitnessCenter/Member/FavoriteColor'/>">

有效:<Body bgcolor="{/FitnessCenter/Member/FavoriteColor}">

3.2 <xsl:attribute输出属性:

<TR>

<xsl:attribute name="bgcolor">yellow</xsl:attribute>

 

4。一般出:

<xsl:value-of select="/FitnessCenter/Member/Phone[@type='home']"/>

 

5。迭代<xsl:for-each

<xsl:for-each select="/FitnessCenter/Member/Phone">

       <!--XPath取得一个XML nodeList-->

      <TR>

          <TD><xsl:value-of select="@type"/></TD>

          <TD><xsl:value-of select="."/></TD>

      </TR>

    </xsl:for-each>

 

   5.1 XPath用法

      <xsl:for-each select="/FitnessCenter/Member[position() != last())]">

        <!-- 除最后一个元素外都 -->

      </xsl:for-each>

 

      <xsl:for-each select="/FitnessCenter/Member[position() &gt;1]">

        <!-- 除第一个元素外都 -->

      </xsl:for-each>

 

      <xsl:for-each select="/FitnessCenter//Name">

        <!-- 取所有以FitnessCenter为辅元素的Name元素 -->

      </xsl:for-each>

 

   5.2叠代中的序号

      <xsl:for-each select="/FitnessCenter/Member">

        <xsl:number value="position()" format="A"/>

        <xsl:text>. </xsl:text>

        <xsl:value-of select="Name"/>

        <BR/>

      </xsl:for-each>

      其中:format(格式)可取一下

      format=“1” generates the sequence: 1, 2, 3, …

      format=“01” generates: 01, 02, 03, …

      format=“A” generates: A, B, C, …

      format=“a” generates: a, b, c, …

      format=“I” generates: I, II, III, …

      format=“i” generates: i, ii, iii, ...

 

   5.3迭代中的排序(<xsl:sort)

      <xsl:for-each select="/FitnessCenter/Member">

        <xsl:sort select="Name" order="ascending"/>

        <xsl:value-of select="Name"/>

        <BR/>

      </xsl:for-each>

 

6。分枝

    6.1简单

      <xsl:for-each select="/FitnessCenter/Member[position() &gt; 1]">

                    Our special offer to platinum members today is ...

                    <BR/>

      </xsl:if>

    6.2复杂

    <xsl:choose>

        <xsl:when test='something>

              [action]

        </xsl:when>

        <xsl:when test='something'>

              [action]

        </xsl:when>

        <xsl:otherwise>

              [action]

        </xsl:otherwise>

    </xsl:choose>

 

7(<xsl:variable)

    7.1简单

       <xsl:variable name="pi" select="'3.142857142857'"/>

    7.2复杂

       <xsl:variable name="names">

         <xsl:value-of select="/FitnessCenter/Member[1]/Name"/>

         <xsl:for-each select="/FitnessCenter/Member[position() &gt; 1]">

                    <xsl:text>/</xsl:text>

                    <xsl:value-of select="Name"/>

         </xsl:for-each>

       </xsl:variable>


文章来源:http://spaces.msn.com/members/jewer91/Blog/cns!1p6udCMYMrSYD0M1VOX6N3VQ!128.entry

posted @ 2005-10-13 13:47 Buddha 阅读(161) 评论(0) 编辑

Swing技巧. 设置全局字体(sun jdk)

为什么要这么做?

   因为java默认的字体显示中文都很难看

   因为比如jgoodies这样的skin默认不支持中文

   因为jdk1.4中文字体mapping有严重bug,用过IDEA的人都知道

   因为大家只有sun的jdk可用,ibm的,bea的都不适合跑client

if you are smart....
//设置全局字体
public static void initGlobalFontSetting(Font fnt){
    FontUIResource fontRes 
= new
 FontUIResource(fnt);
    
for(Enumeration keys =
 UIManager.getDefaults().keys(); keys.hasMoreElements();){
        Object key 
=
 keys.nextElement();
        Object value 
= UIManager.get
(key);
        
if
(value instanceof FontUIResource)
            UIManager.put(key, fontRes);
    }
}
if you aren't...

Font font = new Font("Dialog",Font.PLAIN,12);
UIManager.put(
"ToolTip.font"
,font);
UIManager.put(
"Table.font"
,font);
UIManager.put(
"TableHeader.font"
,font); 
UIManager.put(
"TextField.font"
,font); 
UIManager.put(
"ComboBox.font"
,font); 
UIManager.put(
"TextField.font"
,font); 
UIManager.put(
"PasswordField.font"
,font); 
UIManager.put(
"TextArea.font"
,font); 
UIManager.put(
"TextPane.font"
,font); 
UIManager.put(
"EditorPane.font"
,font); 
UIManager.put(
"FormattedTextField.font"
,font); 
UIManager.put(
"Button.font"
,font); 
UIManager.put(
"CheckBox.font"
,font); 
UIManager.put(
"RadioButton.font"
,font); 
UIManager.put(
"ToggleButton.font"
,font); 
UIManager.put(
"ProgressBar.font"
,font); 
UIManager.put(
"DesktopIcon.font"
,font); 
UIManager.put(
"TitledBorder.font"
,font); 
UIManager.put(
"Label.font"
,font); 
UIManager.put(
"List.font"
,font); 
UIManager.put(
"TabbedPane.font"
,font); 
UIManager.put(
"MenuBar.font"
,font); 
UIManager.put(
"Menu.font"
,font); 
UIManager.put(
"MenuItem.font"
,font); 
UIManager.put(
"PopupMenu.font"
,font); 
UIManager.put(
"CheckBoxMenuItem.font"
,font); 
UIManager.put(
"RadioButtonMenuItem.font"
,font); 
UIManager.put(
"Spinner.font"
,font); 
UIManager.put(
"Tree.font"
,font); 
UIManager.put(
"ToolBar.font"
,font); 
UIManager.put(
"OptionPane.messageFont"
,font); 
UIManager.put(
"OptionPane.buttonFont"
,font); 

 


文章来源:http://spaces.msn.com/members/jewer91/Blog/cns!1p6udCMYMrSYD0M1VOX6N3VQ!129.entry

posted @ 2005-10-13 13:47 Buddha 阅读(163) 评论(0) 编辑