zoukankan      html  css  js  c++  java
  • CAS 单点登录【2】自定义用户验证

       基础不太熟的同学可以先去看:CAS 单点登录【1】入门

    方案1:CAS默认的JDBC扩展方案:

    CAS自带了两种简单的通过JDBC方式验证用户的处理器。

    1.QueryDatabaseAuthenticationHandler
    
    2.SearchModeSearchDatabaseAuthenticationHandler

    这两个处理类位于cas-server-support-jdbc这个扩展工程下。

    第一步:改写用户验证处理器

       deployerConfigContext.xml

    <bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

       把他替换成为 下面两种其中任意一个bean皆可。

    <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>

    或者

     <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>

    把对应的用户表名、用户名、密码替换成为 你实际数据库中的 用户表名、用户名、密码对应的字段名称。

    第二步:加载驱动(oracle、mysql任选一种),连接数据库

    依然在这个文件中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>
  • 相关阅读:
    设计模式系列
    设计模式系列
    【ABAP系列】SAP ABAP DYNP_VALUES_UPDATE 更新屏幕字段的函数及用法
    【HANA系列】SAP HANA 2.0简介
    【HANA系列】SAP HANA Studio使用insufficient privilege 问题
    【HANA系列】SAP HANA Studio出现"Fetching Children..."问题
    【ABAP系列】SAP ABAP smartforms设备类型CNSAPWIN不支持页格式ZXXX
    【BW系列】SAP BW实时抽取ECC数据的实现
    【ABAP系列】SAP ABAP 行列转换的方法
    【HANA系列】SAP HANA数据处理的理解与分析一
  • 原文地址:https://www.cnblogs.com/java-class/p/8393564.html
Copyright © 2011-2022 走看看