cas单点登录

1.下载cas服务端,https://github.com/Jasig/cas/releases cas-server-4.0.0-release.zip 把解压后的文件中modules文件夹中的cas-server-webapp-3.4.8.war文件拷贝的tomcat\wbapps下,并修改文件名为:cas.wa 启动tomcat后能够进入http://localhost/cas界面。

2.使用https进后cas界面,证书对于实现此单点登录非常之重要,证书是服务器端和客户端安全通信的凭证,本教程只是演示,所有用了JDK自带的证书生成工具keytool。当然在实际项目中你可以到专门的证书认证中心购买证书。

用JDK自带的keytool生成证书 命令:keytool -genkey -alias  smalllove -keyalg RSA -keystore D:/keys/smallkey

注:此命令是生成一个证书,其中 smalllove 是证书别名 其中名字与姓氏这一最好写你的 域名,如果在单击测试你可以在C:\Windows\System32\drivers\etc\hosts文件中映射一个虚拟域名,注意不要写IP。

导出证书 命令:keytool -export -file d:/keys/small.crt -alias smalllove -keystore d:/keys/smallkey

把证书导入到客户端JDK中 命令:keytool -import -keystore C:\Java\jdk1.6.0_21\jre\lib\security\cacerts -file D:/keys/small.crt -alias smalllove

注:keytool错误: java.io.IOException: Keystore was tampered with, or password was incorrect 次错误的解决方法是,把%JAVA_HOME%\jre\lib\security下的cacerts文件删除掉,在执行

修改tomcat\conf\server.xml,打开https协议

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
      keystoreFile="D:/keys/smallkey"  <!--在2.1中生成的证书的位置-->
      keystorePass="smalllove"/>       <!--在2.1中设置的密码-->

3.将cas密码证证方式改为数据库验证,这里使用mysql数据库,修改cas\WEB-INF\deployerConfigContext.xml 注释原primaryAuthenticationHandler替换为dbAuthHandler

    <bean id="primaryAuthenticationHandler"
          class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
        <property name="users">
            <map>
                <entry key="casuser" value="Mellon"/>
            </map>
        </property>
    </bean>

替换为:

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
      p:driverClass="com.mysql.jdbc.Driver"
      p:jdbcUrl="jdbc:mysql://localhost:3306/easyui?useUnicode=true&amp;characterEncoding=utf8"
      p:user="root"
      p:password="pwd123" />

    <bean id="passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" p:characterEncoding="UTF-8">   
        <constructor-arg index="0">   
            <value>MD5</value>   
        </constructor-arg>
    </bean>

 <bean id="dbAuthHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
  <property name="sql" value="select password from sys_user where loginname=?" />
  <property name="dataSource" ref="dataSource" />
  <property name="passwordEncoder" ref="passwordEncoder" />
 </bean>

修改authenticationManager下对原primaryAuthenticationHandler的引用:

<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver" />

cas/WEB-INF/lib下加入 c3p0-0.9.1.2.jar,mysql-connector-java-5.1.21.jar,cas-server-support-jdbc-4.0.0.jar

4.客户端下载http://developer.jasig.org/cas-clients/ cas-client-3.2.1 解压后复制modules下的cas-client-core-3.2.1.jar到项目lib下或使用maven配置。

  <dependency>
     <groupId>org.jasig.cas.client</groupId>
     <artifactId>cas-client-core</artifactId>
     <version>3.2.1</version>
  </dependency>

web.xml配置

<!-- ======================== 单点登录开始 ======================== -->
 <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
 <listener>
  <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
 </listener>

 <!-- 该过滤器用于实现单点登出功能,可选配置。 -->
 <filter>
  <filter-name>CAS Single Sign Out Filter</filter-name>
  <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>CAS Single Sign Out Filter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

 <!-- 该过滤器负责用户的认证工作,必须启用它 -->
 <filter>
  <filter-name>CASFilter</filter-name>
  <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
  <init-param>
   <param-name>casServerLoginUrl</param-name>
   <param-value>https://www.travel.com:8443/cas/login</param-value>
   <!--这里的server是服务端的IP -->
  </init-param>
  <init-param>
   <param-name>serverName</param-name>
   <param-value>http://www.travel.com:8080</param-value><span style="color:#FF0000;"> ①</span>
  </init-param>
 </filter>
 <filter-mapping>
  <filter-name>CASFilter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

 <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
 <filter>
  <filter-name>CAS Validation Filter</filter-name>
  <filter-class>
   org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
  <init-param>
   <param-name>casServerUrlPrefix</param-name>
   <param-value>https://www.travel.com:8443/cas</param-value>
  </init-param>
  <init-param>
   <param-name>serverName</param-name>
   <param-value>http://www.travel.com:8080</param-value>  <span style="color:#FF0000;">②</span>
  </init-param>
 </filter>
 <filter-mapping>
  <filter-name>CAS Validation Filter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

 <!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
 <filter>
  <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
  <filter-class>
   org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

 <!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
 <filter>
  <filter-name>CAS Assertion Thread Local Filter</filter-name>
  <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>CAS Assertion Thread Local Filter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

 <!-- ======================== 单点登录结束 ======================== -->

5.客户端获取cas登录用户:

AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();   
String username = principal.getName();

6.客户端退出登录指向cas退出登录页面,带service参数为客户端项目完整路径,如

https://wx.hanjun.com:8443/cas/logout?service=http://wx.hanjun.com/wechat

注:如果直接访问CAS的logout话,会出现注销成功页面,其实大部分情况下这个页面是没有必要的,更多的需求可能是退出后显示登录页面,并且登录成功后还是会进入到之前的业务系统,那么可以修改cas-servlet.xml文件,在"logoutController"的bean配置中增加属性“followServiceRedirects”,设置为“true”,然后在业务系统的注销连接中加入"service参数",值为业务系统的绝对URL,这样就OK了。  <bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
        p:servicesManager-ref="servicesManager"
        p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值