使用CAS服务实现单点登录时,登录用的用户名和密码是通过在cas/WEB-INF下的cas-servlet.xml文件进行配置的,实际应用中,我们需要查询自己的数据库,来实现登录功能。
在cas中配置自定义数据源
- 修改cas服务端中web-inf下deployerConfigContext.xml ,添加如下配置
<!--配置登录要访问数据库的数据源,这里使用c3p0数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8"
p:user="root"
p:password="123456" />
<!--配置加密器,因为用户表的密码是使用MD5加密的,如果密码没有加密,这里也不需要配置-->
<bean id="passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"
c:encodingAlgorithm="MD5"
p:characterEncoding="UTF-8" />
<!--配置认证处理者,在这里需要引入数据源和密码加密器,如果密码是明文,则不需要配置密码加密器-->
<!--这里还需要指定sql,要查询的表名和where条件-->
<bean id="dbAuthHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
p:dataSource-ref="dataSource"
p:sql="select password from tb_user where username = ?"
p:passwordEncoder-ref="passwordEncoder"/>
- 在deployerConfigContext.xml中找到如下配置
<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
<constructor-arg>
<map>
<entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
</map>
</constructor-arg>
<property name="authenticationPolicy">
<bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
</property>
</bean>
这段配置中 entry key-ref=“primaryAuthenticationHandler” value-ref="primaryPrincipalResolver"这一句的表示使用自己配置的用户名和密码登录cas,而需要使用数据库认证用户名和密码,则需要将这句注释,添加一个配置,使用自定义的数据源,修改后如下
<constructor-arg>
<map>
<entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
<!--<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />--> <!--这个配置的意思就是使用配置文件配置的用户名和密码登录cas-->
<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/> <!--引入自定义的认证处理者,因为需要查询数据库-->
</map>
</constructor-arg>
- 因为配置数据源,需要c3p0和masql的驱动包,所以需要将这些jar包加入到webapps\cas\WEB-INF\lib目录下,jar包地址:
链接:https://pan.baidu.com/s/1LzEb-wtH7YCO8MdQw4q7bA 提取码:lc1n
三个jar包在里面的jar目录下
至此,就可以在登录的时候,使用自己数据库中tb_user表中的用户名和密码进行登录了,而原来配置的默认的用户名和密码也就无效了。
当我们使用cas来进行登录时,会默认使用它的登录页面,但是与我们自己的系统风格不一致,也没有那么美观,所以,这里需要将自己的登录页面,成为cas服务的登录页面
修改cas服务端的登录界面
- 将自己登录页面,拷贝到cas系统下WEB-INF\view\jsp\default\ui 目录下,将css,js,images等文件夹拷贝到 cas目录下,将原来的casLoginView.jsp 改名(可以为之后的修改操作做参照),将自己的login.html改名为casLoginView.jsp 。
- 因为自己的登录页面改成了jsp页面,所以需要加入jsp的头信息,因为原来的登录界面,引入了includes下的top.jsp界面,所以,我们只需要将top.jsp里面的jsp头信息,加入到新的casLoginView.jsp 中即可
<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
- 将自己的登录页面里面的form标签,input标签,登录标签都修改成原来的casLoginView.jsp页面里面的格式,因为要套用cas的内核。但是,这些标签的样式,还是需要用自己的。这里,还需要将原来的casLoginView.jsp中的三个隐藏域,也要复制过来
<input type="hidden" name="lt" value="${loginTicket}" />
<input type="hidden" name="execution" value="${flowExecutionKey}" />
<input type="hidden" name="_eventId" value="submit" />
- 都修改好之后,运行,就能使用自己的登录界面,并且使用自己数据库的用户名和密码登录成功。
当我们登录的时候,输入错误的用户名和密码时,不会有错误提示,所以,需要将cas的错误提示加入进去
加入错误提示
- 在表单内加入错误提示框(位置可以由自己决定)
<form:errors path="*" id="msg" cssClass="errors" element="div" htmlEscape="false" />
- 输入错误的用户名和密码,提示是英文。这个提示信息是在WEB-INF\classes目录下的messages.properties文件中
authenticationFailure.AccountNotFoundException=Invalid credentials.
authenticationFailure.FailedLoginException=Invalid credentials.
- 需要将错误提示改成中文,所以修改cas-servlet.xm
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" p:defaultLocale="zh_CN" />
p:defaultLocale="zh_CN"这里默认配置的是en,表示英文,这里要改成zh_CN,表示简体中文
- 在WEB-INF\classes目录下,找到messages_zh_CN.properties,加入配置
authenticationFailure.AccountNotFoundException=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF.
authenticationFailure.FailedLoginException=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF.
这里需要加入中文的转码,系统才能识别,这里的转码含义是:用户名或密码不存在,如果需要其他的错误提示,可以修改,但是一定要是中文转码。
- 都修改之后,再次登录输入错误的信息,就能在登录页面看到:用户名或密码错误的提示信息。