搜索
首页数据库mysql教程Cas(06)基于数据库的认证

基于数据库的认证 Cas Server自身已经为我们实现了几种基于JDBC的AuthenticationHandler实现,但它们不包含在Cas Server的核心包里面,而是包含在cas-server-support-jdbc中,如果我们要使用Cas Server已经实现好的基于JDBC的AuthenticationHandler,我们必

基于数据库的认证

  

       Cas Server自身已经为我们实现了几种基于JDBC的AuthenticationHandler实现,但它们不包含在Cas Server的核心包里面,而是包含在cas-server-support-jdbc中,如果我们要使用Cas Server已经实现好的基于JDBC的AuthenticationHandler,我们必须先将cas-server-support-jdbc对应的jar包、相关数据库的驱动,以及所需要使用的数据源实现等jar包加入Cas Server的类路径中。如果是基于Maven的war覆盖机制来修改Cas Server的配置文件,则我们可以在自己的Maven项目的依赖中加入如下项(对应的驱动就没贴出来了)。

      dependency>

         groupId>org.jasig.casgroupId>

         artifactId>cas-server-support-jdbcartifactId>

         version>${cas.version}version>

         scope>runtimescope>

      dependency>

 

       Cas Server默认已经实现好的基于JDBC的AuthenticationHandler有三个,它们都继承自AbstractJdbcUsernamePasswordAuthenticationHandler,而且在认证过程中都需要一个DataSource。下面来对它们做一个简要的介绍。

 

1.1     BindModeSearchDatabaseAuthenticationHandler

       BindModeSearchDatabaseAuthenticationHandler将试图以传入的用户名和密码从配置的DataSource中建立一个连接,如果连接成功,则表示认证成功,否则就是认证失败。以下是BindModeSearchDatabaseAuthenticationHandler源码的一段主要代码,通过它我们可以明显的看清其逻辑:

    protected final boolean authenticateUsernamePasswordInternal(

        final UsernamePasswordCredentials credentials)

        throws AuthenticationException {

        final String username = credentials.getUsername();

        final String password = credentials.getPassword();

 

        try {

            final Connection c = this.getDataSource()

                .getConnection(username, password);

            DataSourceUtils.releaseConnection(c, this.getDataSource());

            returntrue;

        } catch (final SQLException e) {

            returnfalse;

        }

    }

 

       当然,这种实现也需要你的DataSource支持getConnection(user,password)才行,否则将返回false。dbcp的BasicDataSource的不支持的,而c3p0的ComboPooledDataSource支持。

       以下是一个使用BindModeSearchDatabaseAuthenticationHandler的配置示例:

   bean id="authenticationManager"

      class="org.jasig.cas.authentication.AuthenticationManagerImpl">

      ...

      属性 名称="authenticationHandlers">

         列表>

            ...

            beanclass="org.jasig.cas.adaptors.jdbc.BindModeSearchDatabaseAuthenticationHandler">

                属性 名称="数据源" 参考="数据源"/>

            >

            ...

         列表>

      属性>

      ...

   豆子>

 

1.2     QueryDatabaseAuthenticationHandler

       使用QueryDatabaseAuthenticationHandler需要我们指定一个SQL,该SQL将接收一个用户名作为查询条件,然后返回应答的密码。该SQL将被QueryDatabaseAuthenticationHandler用于通过确定的用户名查询应答的密码,如果存在则将查询的密码与查询出来的密码进行匹配,匹配结果将作为认证结果。如果对应的用户名不存在也将返回false。

       以下是QueryDatabaseAuthenticationHandler的主要一段代码:

    受保护 最终 布尔值 authenticateUsernamePasswordInternal(finalUsernamePasswordCredentials 凭据)抛出 AuthenticationException {

        最终 字符串用户名 = getPrincipalNameTransformer().transform(credentials.getUsername());

        最终 字符串密码 =凭据.getPassword();

        最终 字符串加密密码 = 这个.getPasswordEncoder().encode(

            密码);

       

        尝试 {

            final String dbPassword = getJdbcTemplate().queryForObject(this.sql, String.班级, 用户名);

            返回 dbPassword.equals(encryptedPassword);

        } catch (最终 In CorrectResultSizeDataAccessException e) {

            // 表示未找到用户名。

            返回;

        }

    }

 

       上面的逻辑非常明显。此外,如你所见,QueryDatabaseAuthenticationHandler使用的用户名会经过PrincipalNameTransformer进行转换,而密码会经过PasswordEncoder进行编码。Cas Server中基于JDBC的AuthenticationHandler实现中使用到的PrincipalNameTransformer默认是不进行任何转换的NoOpPrincipalNameTransformer,而默认使用的PasswordEncoder也是不会经过任何编码的PlainTextPasswordEncoder。当然了,cas-server-jdbc-support对它们也有另外两种支持,即PrefixSuffixPrincipalNameTransformer和DefaultPasswordEncoder。

1.2.1  PrefixSuffixPrincipalNameTransformer

       PrefixSuffixPrincipalNameTransformer的作用很明显,如其名称所描述的那样,其在转换时会将用户名加上指定的前缀和后缀。所以用户在使用的时候需要指定prefix和suffix两个属性,默认是空。

 

1.2.2  DefaultPasswordEncoder

       DefaultPasswordEncoder底层使用的是标准Java类库中的MessageDigest进行加密的,其支持MD5、SHA等加密算法。在使用时需要通过构造参数encodingAlgorithm来指定使用的加密算法,可以使用characterEncoding属性注入来指定获取字节时使用的编码,不指定则使用默认编码。以下是DefaultPasswordEncoder的源码,其展示了DefaultPasswordEncoder的加密逻辑。

public final class DefaultPasswordEncoder implements PasswordEncoder {

 

    privatestaticfinalchar[] HEX_DIGITS = {'0''1''2''3''4''5''6''7''8','9''a''b''c''d''e''f'};

 

    @NotNull

    privatefinal String encodingAlgorithm;

 

    private String characterEncoding;

 

    public DefaultPasswordEncoder(final String encodingAlgorithm) {

        this.encodingAlgorithm = encodingAlgorithm;

    }

 

    public String encode(final String password) {

        if (password == null) {

            returnnull;

        }

 

        try {

            MessageDigest messageDigest = MessageDigest

                .getInstance(this.encodingAlgorithm);

 

            if (StringUtils.hasText(this.characterEncoding)) {

                messageDigest.update(password.getBytes(this.characterEncoding));

            } else {

                messageDigest.update(password.getBytes());

            }

 

 

            finalbyte[] digest = messageDigest.digest();

 

            return getFormattedText(digest);

        } catch (最终 NoSuchAlgorithmException e) {

            抛出 SecurityException(e);

        } catch (最终 UnsupportedEncodingException e) {

            抛出 RuntimeException(e);

        }

    }

 

    /**

     * 从摘要中获取原始字节并正确格式化它们。

     *

     * @param bytes 来自摘要的原始字节。

     * @return 格式化字节。

    */

    private String getFormattedText(byte[] bytes) {

        最终 StringBuilder buf =  StringBuilder(字节。长度 * 2);

 

        for (int j = 0; j 长度; j++) {

            buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);

            buf.append(HEX_DIGITS[字节[j] & 0x0f]);

        }

        返回 buf.toString();

    }

 

    public最终void setCharacterEncoding(final 字符串字符编码) {

        这个.characterEncoding = characterEncoding;

    }

}

 

       如果在认证时需要使用DefaultPasswordEncoder,则需要保证数据库中保存的密码的加密方式和DefaultPasswordEncoder的加密算法及逻辑是一致的。这些都不能满足你的需求,则用户可以实现自己的PrincipalNameTransformer和密码编码器。

 

       以下是一个配置使用QueryDatabaseAuthenticationHandler进行认证,且使用DefaultPasswordEncoder对密码进行MD5加密的示例:

   bean id="authenticationManager"

      class="org.jasig.cas.authentication.AuthenticationManagerImpl">

      ...

      属性 名称="authenticationHandlers">

         列表>

            ...

            beanclass="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">

                属性 名称="数据源" 参考="数据源"/>

                属性 名称="密码编码器" 参考=“密码编码器”/>

                属性 名称="sql" =“选择 来自 t_user 的密码,其中用户名 = ?"/>

            >

            ...

         列表>

      属性>

      ...

   豆子>

 

   bean id="密码编码器"=“org.jasig.cas.authentication.handler.DefaultPasswordEncoder”>

      构造函数 ="MD5"/>

   豆子>

 

1.3     SearchModeSearchDatabaseAuthenticationHandler

       SearchModeSearchDatabaseAuthenticationHandler 的主要逻辑相当于生成的用户名和密码作为条件从指定的表中进行查询,如果对应记录存在则表示认证通过。使用该AuthenticationHandler 时需要我们指定查询时使用的表名(tableUsers) 、用户名对应的字段名(fieldUser)和密码对应的字段名(fieldPassword)。此外,还可以稀疏的使用PrincipalNameTransformer和PasswordEncoder。以下是SearchModeSearchDatabaseAuthenticationHandler源码中的主要一段代码:

 

    私有 静态最终 字符串 SQL_PREFIX = "选择 从“;

计数('x')

 

    @NotNull

    私有 字符串fieldUser;

 

    @NotNull

    私有 字符串字段密码;

 

    @NotNull

    私有 字符串tableUsers;

 

    私有 字符串sql;

 

    受保护最终布尔值 authenticateUsernamePasswordInternal(finalUsernamePasswordCredentials 凭据)抛出 AuthenticationException {

        最终 字符串transformedUsername = getPrincipalNameTransformer().transform(credentials.getUsername());

        最终 字符串加密密码 = getPasswordEncoder().encode(credentials.getPassword());

 

        最终int count = getJdbcTemplate().queryForInt(这个.sql,

           转换的用户名,加密的密码);

 

        返回 计数>; 0;

    }

 

    publicvoid afterPropertiesSet() 抛出 异常 {

        这个.sql = SQL_PREFIX + 这个.tableUsers + " 其中“ + 这个fieldUser

        + " = ? 和 " + 这个.字段密码 + " = ?";

    }

 

       以下是一个使用SearchModeSearchDatabaseAuthenticationHandler 的配置示例:

 

   bean id="authenticationManager"

      class="org.jasig.cas.authentication.AuthenticationManagerImpl">

      ...

      属性 名称="authenticationHandlers">

         列表>

            ...

            beanclass="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler">

                属性 名称="数据源" 参考="数据源"/>

                属性 名称="密码编码器" 参考=“密码编码器”/>

                属性 名称="tableUsers" ="t_user"/>

                属性 名称="fieldUser" ="用户名"/>

                属性 名称=“字段密码” ="密码"/>

            >

            ...

         列表>

      属性>

      ...

   豆子>

 

       至此,cas-server-support-jdbc中支持JDBC的三个AuthenticationHandler就讲完了。如果用户觉得它们都不能满足你的要求,则还可以选择使用自己实现的AuthenticationHandler。至于其他认证方式,请参考官方文档。

 

(注:本文是基于cas 3.5.2所写)

http://blog.csdn.net/elim168/article/details/44420293)

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
MySQL:世界上最受欢迎的数据库的简介MySQL:世界上最受欢迎的数据库的简介Apr 12, 2025 am 12:18 AM

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

MySQL的重要性:数据存储和管理MySQL的重要性:数据存储和管理Apr 12, 2025 am 12:18 AM

MySQL是一个开源的关系型数据库管理系统,适用于数据存储、管理、查询和安全。1.它支持多种操作系统,广泛应用于Web应用等领域。2.通过客户端-服务器架构和不同存储引擎,MySQL高效处理数据。3.基本用法包括创建数据库和表,插入、查询和更新数据。4.高级用法涉及复杂查询和存储过程。5.常见错误可通过EXPLAIN语句调试。6.性能优化包括合理使用索引和优化查询语句。

为什么要使用mysql?利益和优势为什么要使用mysql?利益和优势Apr 12, 2025 am 12:17 AM

选择MySQL的原因是其性能、可靠性、易用性和社区支持。1.MySQL提供高效的数据存储和检索功能,支持多种数据类型和高级查询操作。2.采用客户端-服务器架构和多种存储引擎,支持事务和查询优化。3.易于使用,支持多种操作系统和编程语言。4.拥有强大的社区支持,提供丰富的资源和解决方案。

描述InnoDB锁定机制(共享锁,独家锁,意向锁,记录锁,间隙锁,下一键锁)。描述InnoDB锁定机制(共享锁,独家锁,意向锁,记录锁,间隙锁,下一键锁)。Apr 12, 2025 am 12:16 AM

InnoDB的锁机制包括共享锁、排他锁、意向锁、记录锁、间隙锁和下一个键锁。1.共享锁允许事务读取数据而不阻止其他事务读取。2.排他锁阻止其他事务读取和修改数据。3.意向锁优化锁效率。4.记录锁锁定索引记录。5.间隙锁锁定索引记录间隙。6.下一个键锁是记录锁和间隙锁的组合,确保数据一致性。

MySQL查询性能差的常见原因是什么?MySQL查询性能差的常见原因是什么?Apr 12, 2025 am 12:11 AM

MySQL查询性能不佳的原因主要包括没有使用索引、查询优化器选择错误的执行计划、表设计不合理、数据量过大和锁竞争。 1.没有索引导致查询缓慢,添加索引后可显着提升性能。 2.使用EXPLAIN命令可以分析查询计划,找出优化器错误。 3.重构表结构和优化JOIN条件可改善表设计问题。 4.数据量大时,采用分区和分表策略。 5.高并发环境下,优化事务和锁策略可减少锁竞争。

您什么时候应该使用复合索引与多个单列索引?您什么时候应该使用复合索引与多个单列索引?Apr 11, 2025 am 12:06 AM

在数据库优化中,应根据查询需求选择索引策略:1.当查询涉及多个列且条件顺序固定时,使用复合索引;2.当查询涉及多个列但条件顺序不固定时,使用多个单列索引。复合索引适用于优化多列查询,单列索引则适合单列查询。

如何识别和优化MySQL中的慢速查询? (慢查询日志,performance_schema)如何识别和优化MySQL中的慢速查询? (慢查询日志,performance_schema)Apr 10, 2025 am 09:36 AM

要优化MySQL慢查询,需使用slowquerylog和performance_schema:1.启用slowquerylog并设置阈值,记录慢查询;2.利用performance_schema分析查询执行细节,找出性能瓶颈并优化。

MySQL和SQL:开发人员的基本技能MySQL和SQL:开发人员的基本技能Apr 10, 2025 am 09:30 AM

MySQL和SQL是开发者必备技能。1.MySQL是开源的关系型数据库管理系统,SQL是用于管理和操作数据库的标准语言。2.MySQL通过高效的数据存储和检索功能支持多种存储引擎,SQL通过简单语句完成复杂数据操作。3.使用示例包括基本查询和高级查询,如按条件过滤和排序。4.常见错误包括语法错误和性能问题,可通过检查SQL语句和使用EXPLAIN命令优化。5.性能优化技巧包括使用索引、避免全表扫描、优化JOIN操作和提升代码可读性。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版