基础不太熟的同窗能够先去看:CAS 单点登陆【1】入门html
方案1:CAS默认的JDBC扩展方案:java
CAS自带了两种简单的经过JDBC方式验证用户的处理器。mysql
1.QueryDatabaseAuthenticationHandler
2.SearchModeSearchDatabaseAuthenticationHandler
这两个处理类位于cas-server-support-jdbc这个扩展工程下。web
第一步:改写用户验证处理器sql
deployerConfigContext.xml数据库
<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
把他替换成为 下面两种其中任意一个bean皆可。apache
<bean id="SearchModeSearchDatabaseAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default"> <property name="tableUsers"> <value>users</value> </property> <property name="fieldUser"> <value>user_id</value> </property> <property name="fieldPassword"> <value>password</value> </property> <property name="dataSource" ref="dataSource" /> </bean>
或者oracle
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <property name="dataSource" ref="dataSource" /> <property name="sql" value="select password from some_table where lower(username) = lower(?)" /> </bean>
把对应的用户表名、用户名、密码替换成为 你实际数据库中的 用户表名、用户名、密码对应的字段名称。app
第二步:加载驱动(oracle、mysql任选一种),链接数据库webapp
依然在这个文件中deployerConfigContext.xml,在最后一个</bean>标签以前,加上下面配置便可(oracle、mysql任选其一)。
<!-- Oracle connector --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"> <value>oracle.jdbc.driver.OracleDriver</value> </property> <property name="url"> <value>jdbc:oracle:thin:@database-server-name:1521:SID</value> </property> <property name="username"> <value>admusr</value> </property> <property name="password"> <value>admpwd</value> </property> </bean> <!-- MySQL connector --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://database-server-name:3306/db-name</value> </property> <property name="username"> <value>admusr</value> </property> <property name="password"> <value>admpwd</value> </property> </bean>
第三步:导入必要的jar包
cas-server-webapp的pom.xml
<!-- 必须导入start --> <dependency> <groupId>org.jasig.cas</groupId> <artifactId>cas-server-support-jdbc</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.2.1</version> <scope>runtime</scope> </dependency> <!-- 必须导入end --> <!-- oracle 、 mysql 任选其一 start--> <dependency> <groupId>oracle</groupId> <artifactId>ojdbc14</artifactId> <version>10.2.0.4</version> <scope>provided</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.5</version> <scope>provided</scope> </dependency> <!-- oracle 、 mysql 任选其一 end-->
从新启动项目,在登陆页验证便可。
方案2:套用原有项目的用户登陆逻辑(非JDBC方式)
背景:
1.由于是要整合多个项目的登陆功能,换句话说,就是原有的项目其实分别都有已经实现的用户登陆逻辑页面、登陆逻辑,而且是通过了大量测试,程序逻辑比较健壮。
2.原有的项目并非经过JDBC方式来访问数据库的,为了保持代码风格统一,最好与其余项目保持一致,或者直接套用原有的验证逻辑。(好比:咱们项目使用的是Mybatis方式)
3.CAS扩展的JDBC验证方式仍是过于简单,对于复杂的验证逻辑不便于扩展。
第一步:自定义一个用户验证处理器
能够在原有的cas-server-support-jdbc工程下,也能够本身新建一个工程
注意:本类要继承这个类AbstractUsernamePasswordAuthenticationHandler
public final class MyUserAuthenticationHandler extends AbstractUsernamePasswordAuthenticationHandler { /** * 这个API是原有项目验证用户相关处理的API,直接导入相关jar包就可使用 */ @Autowired private UserApi userApi; @Override protected final boolean authenticateUsernamePasswordInternal( final UsernamePasswordCredentials credentials) throws MyAuthenticationException { String username = getPrincipalNameTransformer().transform(credentials.getUsername()); String password = credentials.getPassword(); try { userApi.login(username, password); } catch (Exception e) { throw new MyAuthenticationException(e); } return true; } }
第二步:自定义异常处理器
由于CAS原有的异常处理逻辑是,只能经过errorcode去messages_zh_CN.properties寻找已经中定义好的异常消息,
若是找不到直接返回errorcode到页面,并不支持直接抛出文字形式的异常消息。还须要为每种异常都定义专属的异常类,例如:
BadCredentialsAuthenticationException.java
BadPasswordAuthenticationException.java
BadUsernameOrPasswordAuthenticationException.java
而本异常类能够直接接受Api抛出的全部异常,或者也能够自定义文字形式的异常消息。如:new Exception("这是异常消息")
一样也支持原有的根据errorCode读取异常消息的方式。
public final class MyAuthenticationException extends AuthenticationException { /** Serializable ID. */ private static final long serialVersionUID = 3906648604830611762L; /** * 本构造方法能够返回任何自定义的异常消息到前台 * <p>例子:TongXiangAuthenticationException(new Exception("自定义的异常消息"))</p> */ public MyAuthenticationException(final Throwable throwable) { super(throwable.getMessage()); } /** * 本构造方法只能返回在messages_zh_CN.properties中已经定义好的异常消息 */ public MyAuthenticationException(final String code) { super(code); }
第三步:修改deployerConfigContext.xml
方案1中,在配置文件中配置了
JDBC方式的处理器bean、链接数据库的BasicDataSource bean 这里通通不须要。
直接找到这个处理器
<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
把他替换成为自定义的验证处理器。
<bean class="org.jasig.cas.authentication.handler.support.MyUserAuthenticationHandler" />
由于,访问数据库以及验证用户逻辑的处理都在UserApi中作处理,不须要CAS再作处理了。
第四步:pom.xml加载自定义的工程或者被修改的工程jar包
cas-server-webapp的pom.xml
<dependency> <groupId>org.jasig.cas</groupId> <artifactId>cas-server-support-jdbc</artifactId> <version>${project.version}</version> </dependency>
或者用户自定义的项目
<dependency> <groupId>org.jasig.cas</groupId> <artifactId>cas-server-support-myself</artifactId> <version>1.0</version> </dependency>