基礎不太熟的同窗能夠先去看: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>