简要概述实现步骤(思路):
1.创建web应用
2.集成CAS(使用CAS服务端内配置账户密码进行登录验证)
2.1导入jar包
2.2配置web.xml文件(拦截跳转验证以及验证结束返回)
3.配置CAS服务端使用数据库表进行登录验证(CAS本地服务搭建)
3.1修改CAS服务端配置文件
4.再创建多个web应用,实现真正的单点登录
4.1同理步骤1、2,登录其中一个应用,其他应用便不用再登录
1.web应用
2.集成CAS(web.xml添加配置)
注意:CAS服务端deployerConfigContext.xml文件这里要加入"http",因为这里web应用采用的是http,不加的话会报没权限使用CAS验证服务。
<util:list id="registeredServicesList">
<bean class="org.jasig.cas.services.RegexRegisteredService"
p:id="0" p:name="HTTP and IMAP" p:description="Allows HTTP(S) and IMAP(S) protocols"
p:serviceId="^(https?|imaps?|http?)://.*" p:evaluationOrder="10000001" />
导入jar包:
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-core-authentication</artifactId>
<version>4.2.7</version>
</dependency>
配置web.xml文件:
<!--cas相关开始-->
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
<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>
<!-- 登录校验分两步:1.用户名密码校验成功,返回ticket 2.再次请求CAS服务端验证ticket是否有效 -->
<!-- 该过滤器负责用户的认证工作,必须启用它 -->
<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.sso.com:8443/cas/login</param-value>
<!--这里的server是服务端的IP,注意后面有/login -->
</init-param>
<init-param>
<!--这里是集成CAS服务的服务地址,即登录校验后跳转的地址-->
<param-name>serverName</param-name>
<param-value>http://localhost:28081</param-value>
</init-param>
<!--忽略校验的地址,即配置不需要登录校验的请求-->
<init-param>
<param-name>ignorePattern</param-name>
<param-value>/js/*|/img/*|/view/*|/css/*|/page/list</param-value>
</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.sso.com:8443/cas</param-value>
<!-- 该地址为校验ticket的地址,注意后面没有/login -->
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:28081</param-value>
<!-- 校验成功后跳转的地址(CAS服务端那边) -->
</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>
<!--cas相关结束-->
到此第二步完成,启动应用访问 http://localhost:28081 发现集成成功,访问主页需要登录,默认账户密码:casuser --- Mellon
3.配置CAS服务端使用数据库表进行登录验证
说明:
认证对比方式为:先根据username查询数据库,返回password(已加密存储),加密登录页面传进来的password,对比这两个password是否相等。
CAS服务端导入jar包:
cas-server-support-jdbc-4.2.7.jar、cas-server-support-rest-4.2.7.jar、mysql-connector-java-5.1.45.jar
配置deployerConfigContext.xml文件:
注释掉原有的认证bean:
<!--查询数据所采用什么加密方式 认证方式:查询数据库-->
<bean id="queryDatabaseAuthenticationHandler" name="primaryAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="passwordEncoder" ref="MD5PasswordEncoder"/>
<property name="dataSource" ref="dataSource"/>
<property name="sql" value="${cas.jdbc.authn.query.sql}"/>
</bean>
<!--配置加密算法 密码采用的加密方式-->
<bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">
<constructor-arg value="MD5"/>
</bean>
<!--名字叫dataSource的Bean取别名叫queryDatabaseDataSource-->
<alias name="dataSource" alias="queryDatabaseDataSource"/>
<!--配置数据源-->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"
p:user="root"
p:password="123456"
p:initialPoolSize="6"
p:minPoolSize="6"
p:maxPoolSize="18"
p:maxIdleTimeExcessConnections="120"
p:checkoutTimeout="10000"
p:acquireIncrement="6"
p:acquireRetryAttempts="5"
p:acquireRetryDelay="2000"
p:idleConnectionTestPeriod="30"
p:preferredTestQuery="select 1"/>
<!--end 从数据库中的用户表中读取 -->
配置cas.properties文件,添加查询数据库sql语句:
# cas.jdbc.authn.query.sql=
cas.jdbc.authn.query.sql=select password from user where username=?
到此,配置完成。
验证:数据库存入 test1 --- 594f803b380a41396ed63dca39503542 登录页面输入test1 --- aaaaa
注:笔记使用