查询数据库完成认证

开始吧

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了就。

测试是成功的~

posted @ 2020-11-09 16:04  我才不是你的谁  阅读(202)  评论(0编辑  收藏  举报