• 查询数据库完成认证


    开始吧

    1、 SpringSecurity对于密码查询校验是有默认实现的

        //重写另外一个父类的方法,来设置登录系统的账号密码(走数据库)
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    
            //基于数据库的做查询的
            auth
                    .jdbcAuthentication()
                    .usersByUsernameQuery("you_username")
                    ;
            .......
        }
    

    调用的.usersByUsernameQuery("you_username")方法去查的;具体这个方法怎么查的,查看源码:

    public class JdbcDaoImpl extends JdbcDaoSupport implements UserDetailsService, MessageSourceAware {
        public static final String DEF_USERS_BY_USERNAME_QUERY = "select username,password,enabled from users where username = ?";
        .......
    

    可以看到最终方法usersByUsernameQuery("you_username")最终调用JdbcDaoImpl类的方法查询数据库。

    SpringSecurity的默认实现已经将 SQL 语句硬编码在了 JdbcDaoImpl 类中。这种 情况下,我们有下面三种选择:

    1. 按照 JdbcDaoImpl 类中 SQL 语句设计表结构。(截趾适屦)
    2. 修改 JdbcDaoImpl 类的源码。(一般情况下多数人是不会选择改源码的,避免维护的时候遗忘过改过源码这一说)
    3. 不使用 jdbcAuthentication(),自定义数据库查询方式 。(适合)

    2、 自定义数据库查询方式

    自定义一个类MyUserDetailsService实现UserDetailsService接口的类并自动装配。

    /**
     * 自定义数据库查询方式
     * 实现UserDetailsService接口的类并自动装配。
     */
    /**
     * 自定义数据库查询方式
     * 实现UserDetailsService接口的类并自动装配。
     */
    @Component
    public class MyUserDetailsService implements UserDetailsService {
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        /**
         * 根据表单提交的用户名查询User对象 并装配角色、权限的信息
         * @param username  表单提交的(输入的)账号
         * @return
         * @throws UsernameNotFoundException
         */
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            // 1. 使用sql语句根据用户名查询用户对象
            String sql = "SELECT id, loginacct, userpswd, username, email, createtime FROM t_admin WHERE loginacct=? ";
            // 2. 获取查询结果
            Map<String, Object> resultMap = jdbcTemplate.queryForMap(sql, username);
            // 3. 获取用户名账号和密码
            String loginacct = resultMap.get("loginacct").toString();
            String userpswd = resultMap.get("userpswd").toString();
            // 4. 创建角色和权限列表:角色用以ROLE_区分
            List<GrantedAuthority> authorityList = AuthorityUtils.createAuthorityList("ROLE_ADMIN","ROLE_学徒", "ROLE_大师","UPDATE","SAVE");
            // 5. 创建用户对象:最后返回的这个对象就是用来比对信息的
            User user = new User(loginacct, userpswd, authorityList);
            // 6. 返回用户信息
            return user;
        }
    }
    

    开始我注入jdbcTemplate对象的时候,@Autowired这个注解一直爆红。我去看了我是不是没有被扫描到结果不是,也配置了bean。

    后来发现我把它写在局部变量的位置了。这玩意儿是成员位置。啥也不是~我这人就他妈马虎!

    3、 创建t_admin表

    SpringSecurity默认实现的表是固定死的,前面也有写到。

    顺便添加点数据

    CREATE TABLE `t_admin` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `loginacct` varchar(255) NOT NULL,
      `userpswd` char(32) NOT NULL,
      `username` varchar(255) NOT NULL,
      `email` varchar(255) NOT NULL,
      `createtime` char(19) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    

    4、 测试通不通数据库查询

    整个框架自定义查询数据库方式就是:用户输入的username取到,通过框架根据username进行查询。如果有此账号,就查出来它的这条数据,然后取到密码啥的进行后来的比对。如果通过username查不到直接return了就。

    测试是成功的~

  • 相关阅读:
    通过反射获取Android通知栏高度
    Android 的EditText实现不可编辑
    Android 代码混淆、第三方平台加固加密、渠道分发 完整教程(图文)
    eclipse、myeclipse,svn插件subclipse 忘记密码的解决方法(win7、win8、xp)
    Eclipse 基于接口编程的时候,快速跳转到实现类的方法(图文)
    WIN7、WIN8 右键在目录当前打开命令行Cmd窗口(图文)
    eclipse,myeclipse开发环境下,maven远程部署到tomcat7服务器(图文)
    python之路——博客目录
    生成器和协程 —— 你想知道的都在这里了
    python3.7导入gevent模块报错的解决方案
  • 原文地址:https://www.cnblogs.com/jinyuanya/p/13949040.html
Copyright © 2020-2023  润新知