简要概述实现步骤(思路):
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>: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>: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.boPooledDataSource"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
注:笔记使用