开始吧
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 类中。这种 情况下,我们有下面三种选择:
- 按照 JdbcDaoImpl 类中 SQL 语句设计表结构。(截趾适屦)
- 修改 JdbcDaoImpl 类的源码。(一般情况下多数人是不会选择改源码的,避免维护的时候遗忘过改过源码这一说)
- 不使用 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了就。
测试是成功的~