cas(sso)服务器
2016-07-12 00:00
218 查看
1.cas4.0server端下载地址
迅雷地址:http://developer.jasig.org/cas/cas-server-4.0.0-release.zip也可以去最新的地址: https://www.apereo.org/projects/cas/download-cas或者http://developer.jasig.org/cas/选择你需要的下载 [b][b][b]2. 部署cas服务 [/b][/b][/b]
解压cas-server-4.0.0-release.zip后拷贝出cas-server-4.0.0\modules的cas-server-webapp-4.0.0.war到tomcat的webapp目录,重命名为cas
3.创建证书(下面会用到)
证书是单点登录认证系统中很重要的一把钥匙,客户端于服务器的交互安全靠的就是证书;本教程由于是演示所以就自己用JDK自带的keytool工具生成证书;如果以后真正在产品环境中使用肯定要去证书提供商去购买,当然现在也有免费。
keytool -genkey -alias tomcatcas -keystore d://castest -keyalg RSA -validity 3666
详细操作:
因为sso.castest.com不存在,估需要修改hosts文件 (C:\Windows\System32\drivers\etc\hosts)
增加:127.0.0.1 sso.castest.com
4.导出证书
证书导出:
keytool -export -alias tomcatcas -keystore d://castest -file d://tomcatcas.crt
5.为客户端的JVM导入证书
如果命令中存在空格,命令将报错
keytool -import -keystore D:\software\Java\jdk1.8.0_20\jre\lib\security\cacerts -file D:/tomcatcas.crt -alias tomcatcas
注意:这里需要输入密码,此密码不是前面设定的密码,是DK安装后会默认创建一个密钥库,密码为:changeit
D:\software\Java\jdk1.8.0_20\jre\lib\security\ -- 是jre的目录;至此证书的创建、导出、导入到客户端JVM都已完成,下面开始使用证书到Web服务器中
6.启用Web服务器(Tomcat)的SSL,也就是HTTPS加密协议
打开tomcat目录的conf/server.xml文件,取消开启84和88行左右的注释代码,并设置keystoreFile、keystorePass修改结果如下:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystorefile=" 7ff0 D:/wsriakey" keystorepass="castest"/>
参数说明:
keystoreFile:在第一步创建的key存放位置
keystorePass:创建证书时的密码
7.简单配置CAS SERVER后进行验证
启动tomcat后浏览器输入http://sso.castest.com:8443/cas/
注意:cas4.0以前主需要用户名和密码相同即可,但是4.0后默认的用户名/密码: casuser/Mellon否则会报“cas Invalid credentials.”提示
成功进入cas登录页面
8. casserver的数据验证配置
需要依赖的jar:c3p0-0.9.1.2.jar,mysql-connector-java-5.1.21.jar,cas-server-support-jdbc-4.0.0.jar拷贝到cas\WEB-INF\lib下
对配置文件修改:
tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml1).注释默认的简单登录配置
<!-- <bean id="primaryAuthenticationHandler" class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler"> <property name="users"> <map> <entry key="casuser" value="Mellon"/> </map> </property> </bean> -->2).增加数据库连接
<!-- Define the DB Connection --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" p:driverClass="com.mysql.jdbc.Driver" p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/xxx?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" p:user="root" p:password="root" /> <!-- Define the encode method--> <bean id="passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" c:encodingAlgorithm="MD5" p:characterEncoding="UTF-8" /> <bean id="dbAuthHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler" p:dataSource-ref="dataSource" p:sql="select password from xxxx where name=?" p:passwordEncoder-ref="passwordEncoder"/> <!-- p:passwordEncoder-ref="passwordEncoder"如果无加密不需要 passwordEncoder bean 与p:passwordEncoder-->3).更换验证Handle(找到id=authenticationManager的bean)
<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager"> <constructor-arg> <map> <!-- | IMPORTANT | Every handler requires a unique name. | If more than one instance of the same handler class is configured, you must explicitly | set its name to something other than its default name (typically the simple class name). --> <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" /> <entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver" /> <!-- <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" /> --> </map> </constructor-arg> </bean>是为了注释掉key-ref="primaryAuthenticationHandler"的部分,然后引入id=dbAuthHandler的bean之后重启tomcat 进行验证.服务端就配置完成
8.客户端配置
1). 增加cas-client的jar包(
cas-client-core-3.4.1.jar
),有两种方式:
传统型 :下载cas-client,地址:http://developer.jasig.org/cas-clients/,然后解压cas-client-3.1.12.zip,在modules或者WEB-INF文件夹中,请根据自己的项目情况选择使用
Maven
<dependency> <groupId>org.jasig.cas.client</groupId> <artifactId>cas-client-core</artifactId> <version>3.4.1</version> </dependency>
2).客户端所有的web.xml配置
<!-- ======================== 单点登录/登出 ======================== --> <!-- 该过滤器用于实现单点登出功能,可选配置。 --> <filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <!-- 该过滤器负责用户的认证工作,必须启用它 --> <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://localhost:8443/cas/login</param-value> </init-param> <init-param> <param-name>serverName</param-name> <param-value>http://localhost:8080</param-value> </init-param> </filter> <!-- 该过滤器负责对Ticket的校验工作,必须启用它 --> <filter> <filter-name>CAS Validation Filter</filter-name> <filter-class>org.jasig.cas.client.validation.Cas10TicketValidationFilter</filter-class> <init-param> <param-name>casServerUrlPrefix</param-name> <param-value>https://localhost:8443/cas</param-value> </init-param> <init-param> <param-name>serverName</param-name> <param-value>http://localhost:8080</param-value> </init-param> <init-param> <param-name>redirectAfterValidation</param-name> <param-value>true</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> <!-- 该过滤器使得开发者可以通过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 Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS Authentication Filter</filter-name> <url-pattern>/*</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> <filter-mapping> <filter-name>CAS Assertion Thread Local Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <!-- ======================== 单点登录/登出结束 ======================== -->
9客户端与shiro进行整合配置
1).增加需要的jar包
shiro-cas-1.2.4.jar、
cas-client-core-3.4.1.jar(下载参考第8步)
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-cas</artifactId> <version>1.2.4</version> </dependency>
2)修改shiro的配置(spring-shiro.xml)
修改shiroFilter:
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <!-- 设定角色的登录链接,这里为cas登录页面的链接可配置回调地址 --> <property name="loginUrl" value="http://sso.castest.com:7443/cas/login?service=http://localhost:8080/admin/login.htm" /> <property name="successUrl" value="http://localhost:8080/admin/index.htm"></property> <!-- 加这句会出现页面循坏重定向 --> <property name="filters"> <map> <entry key="casFilter" > <bean class="org.apache.shiro.cas.CasFilter"> <!--配置验证错误时的失败页面 /main 为系统登录页面 --> <property name="failureUrl" value="/login.htm" /> </bean> </entry> </map> </property> <property name="unauthorizedUrl" value="/unauthorized.htm" /> <property name="filterChainDefinitions"> <value> /favicon.ico = anon /login.htm = anon /error/ajaxUnauthorized.htm = anon /doRegister.htm = anon /doAjaxLogin.htm = anon /logout.htm = logout /service/*.htm=anon /*.htm= authc /**/*.htm=authc </value> </property> </bean>
shiroRealm的配置中添加两个属性,分别为cas服务器的登录地址和cas客户端的入口即会被拦截的地址:
<!--自定义Realm 继承自CasRealm --> <bean id="shiroJdbcRealm" class="com.lz.core.shiro.ShiroJdbcRealm"> <property name="casServerUrlPrefix" value="http://sso.castest.com:7443/cas/"/> <!-- 一定是ip+port+context path --> <property name="casService" value="http://localhost:8080/admin/doLogin.htm"/> <!-- 没有这句,认证不会通过,casfilter失败 --> </bean>
在securityManager的配置中加入属性:
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <!--设置自定义realm --> <property name="realm" ref="shiroJdbcRealm" /> <property name="cacheManager" ref="shiroCacheManager" /> <property name="subjectFactory" ref="casSubjectFactory"/> <!-- 增加CasSubject --> </bean>
加入casSubjectFactory Bean的配置
<bean id="casSubjectFactory" class="org.apache.shiro.cas.CasSubjectFactory"/> <!-- 引入CasSubject -->
参考页面
http://dead-knight.iteye.com/blog/1525671 http://blog.csdn.net/zhuojiajin/article/details/42973251 http://blog.csdn.net/ppt0501/article/details/41728819
相关文章推荐
- 下载文件名乱码
- mongodb笔记
- web文件单独指向地址配置
- java23种设计模式
- Ehcache 整合Spring 使用页面、对象缓存,java
- poi框架excel导出合并列
- shrio学习
- Java中的阻塞和非阻塞IO包各自的优劣思考
- 程序员学习能力提升三要素
- java23种设计模式
- happen-before 规则
- 基于Jersey的RESTful学习
- java.io.FileNotFoundException:文件名、目录名或卷标语法不正确
- 日志LogBack
- Hibernate N+1 问题及解决办法
- Spring 方法注入 非单例bean的调用
- jdk7和8的一些新特性介绍
- <shrio学习>-扩展FormAuthenticationFilter实现动态改变LoginUrl
- 5个常用的Java分布式缓存框架
- 敏捷开发中高质量 Java 代码开发实践