基于CAS实现单点登入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzxadsl/article/details/47423351
一、生成密钥
在D:/keys目录打开cmd,输入命令:
keytool -genkey -alias  test_auth -keyalg RSA -keystore D:/keys/caskey.keystore
密钥名称:caskey 别名:test_auth 密码:asdfgh


其中名字与姓氏最好写你的 域名,如果在本地测试你可以在C:\Windows\System32\drivers\etc\hosts文件中映射一个虚拟域名


二、导出服务端证书
命令:
     keytool -export -file d:/keys/test_auth.crt -alias test_auth -keystore d:/keys/caskey.keystore

导出的证书名称:test_auth.crt,caskey为上一步生成的密钥名称




三、把证书导入到客户端JDK的cacerts证书库中(客户端tomcate一定要引用该jdk)
     如果不再同一台电脑上,把服务端证书拷贝到客户端电脑上在进行操作

1、进入到" D:\Program Files\Java\jdk1.7.0_75\jre\lib\security "此目录,将cacerts删除

2、运行-->cmd-->输入   

keytool -import -keystore "D:\Program Files\Java\jdk1.7.0_75\jre\lib\security\cacerts" -storepass asdfgh -keypass asdfgh -file d:\keys\test_auth.crt

storepass 生成密钥时第一次输入的口令 keypass 生成密钥时第二次输入的口令



3、输入y 即可。

注意:D:\Program Files\Java\jdk1.7.0_75\jre\lib\security 为客户端tomcate所引用的jdk路径, 安装 JDK 是有两个 jre 目录,一个在 jdk 底下,一个是独立的 jre


在服务端tomcate service.xml中开启https
<!--开启了此处证书 keystoreFile生成的证书的位置 keystorePass设置的密码-->
   <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
    maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
                  keystoreFile="D:/keys/caskey.keystore"
                  keystorePass="asdfgh" />
4、请把web.xml中的serverName改成自己的IP地址

注:"f:\sso\test_auth.crt"为证书文件所在路径,test_auth.acr 为 测试证书
遇到问题
1、配置完仍然无法使用?
请关闭浏览器,重新打开浏览器

2、后台出现异常



请确认你刚才导入证书的JDK是你现在 Tomcat运行所使用的JDK





3、javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching xxx.xxx.xx found
检查web.xml中的配置
   <init-param>
         <param-name>casServerLoginUrl</param-name>
         <param-value>https://sso.gevin.me:8443/cas/login</param-value>
     </init-param>
确保其中的sso.gevin.me跟生成证书时第一个问填写的域名是一致的。如图:



客户端基于spring wen.xml配置
所需包

      < context-param >
        < param-name > serverName </ param-name >
        < param-value > http://127.0.0.1:8080/ </ param-value >
    </ context-param >
    < context-param >
        < param-name > casServerUrl </ param-name >
        < param-value > https://cas.service.com:8443/ </ param-value >
    </ context-param >
   
    <!-- CAS Server 通知 CAS Client,删除session,注销登录信息  youcb 20141117 -->  
   < 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 >
   < listener >
        < listener-class > org.jasig.cas.client.session.SingleSignOutHttpSessionListener </ listener-class >
  </ listener >  
  < filter >
      < filter-name > CAS Authentication Filter </ filter-name >
        < filter-class > org.jasig.cas.client.authentication.AuthenticationFilter </ filter-class >
       < init-param >
         < param-name > casServerLoginUrl </ param-name >
         < param-value > https://cas.service.com:8443/cas-service/login </ param-value >
       </ init-param >
  </ filter >
  < 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://cas.service.com:8443/cas-service </ param-value >
    </ init-param >
    < init-param >  
       < param-name > redirectAfterValidation </ param-name >  
       < param-value > true </ param-value >  
    </ init-param >
    < init-param >  
        < param-name > encoding </ param-name >  
        < param-value > UTF-8 </ param-value >  
    </ init-param >
  </ filter >
  <!-- 该过滤器负责实现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 Authentication Filter </ filter-name >
        < url-pattern > /loginPage.htm </ url-pattern >
    </ filter-mapping >
    
    < filter-mapping >
        < filter-name > CAS Validation Filter </ filter-name >
        < url-pattern > /* </ url-pattern >
    </ filter-mapping >
    
    < filter-mapping >
        < filter-name > CAS HttpServletRequest Wrapper Filter </ filter-name >
        < url-pattern > /* </ url-pattern >
    </ filter-mapping >
    <!-- 单点登入END -->
客户端可通过以下获取返回信息
Assertion assertion = AssertionHolder.getAssertion();
AttributePrincipal ap =  assertion.getPrincipal();
String name = ap.getName();
或者
Principal principal = httpRequest.getUserPrincipal();

猜你喜欢

转载自blog.csdn.net/lzxadsl/article/details/47423351