Sping Security-动态认证用户信息

网友投稿 527 2023-06-13

Sping Security-动态认证用户信息

Sping Security-动态认证用户信息

概述

我们前两节介绍的Spring Security的身份认证的用户和密码在启动服务器后自动生成、代码写死或者存储到内存中,但是在实际项目中需要从动态的数据库中获取用户信息进行身份认证。Spring Security提供了一个UserDetailsService实现类JdbcUserDetailsManager来帮助我们以JDBD的方式对接数据库和Spring Security。

项目准备

添加依赖

我们使用的数据库是mysql,查询数据方式使用的是mybatis-plus因此需要引入mysql驱动和mybatis-plus依赖。

添加数据库配置

我们添加过依赖以后,需要在application.yml中添加数据库链接,实现如下:

在这里数据库的默认链接是mybatis数据库,用户名是root,密码是root,读者可以根据实际情况,自行修改

创建user和权限表:

我们这个只是实例,所以只创建一个简单的用户(sys_user)和权限(sys_authorities)两张表,sql如下:

实体类

创建sys_user和sys_authorities两张表对应的实体类。

sys_user实体类。

@Data@TableName("sys_user")public class UserEntity { private Long id; private String username; private String password; private Integer age; private String email; private Integer enabled; private String phone;}

sys_authorities实体类。

@Data@TableName("sys_authorities")public class AuthoritiesEntity { private Long id; private String UserId; private String authorities;}

实现两个实体类的Mapper

我们使用mybatis-plus实现这两个实体类的mapper,因为这样我们(例子)可以减少代码。

public interface UserMapper extends BaseMapper {}public interface AuthoritiesMapper extends BaseMapper {}

添加@MapperScan注解

UserDetailsService的实现

我们需要自定义个UserDetailsService接口的实现类CustomUserDetailsService,用于实现UserDetailsService接口中的loadUserByUsername方法,通过该方法定义获取用户信息的逻辑。

UserDetailsService接口。

CustomUserDetailsService的代码实现。

@Slf4j@Service("customUserDetailsService")public class CustomUserDetailsService implements UserDetailsService { @Autowired private UserMapper userMapper; @Autowired private AuthoritiesMapper authoritiesMapper; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { log.info("认证请求: "+ username); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("username",username); List userEntities = userMapper.selectList(wrapper); if (userEntities.size()>0){ QueryWrapper wrapper1 = new QueryWrapper<>(); wrapper.eq("userId", userEntities.get(0).getId()); List authorities = authoritiesMapper.selectList(wrapper1); return new User(username, userEntities.get(0).getPassword(), AuthorityUtils.createAuthorityList(authorities.toString())); } return null; }}

重构configure(AuthenticationManagerBuilder auth)方法

重新实现configure(AuthenticationManagerBuilder auth)方法。

在LearnSrpingSecurity类中注入customUserDetailsService。在configure(AuthenticationManagerBuilder auth)方法中指定认证用户方式。

代码实现如下:

@Autowired private UserDetailsService customUserDetailsService; /** * 认证管理器 * 1.认证信息提供方式(用户名、密码、当前用户的资源权限) * 2.可采用内存存储方式,也可能采用数据库方式等 * @param auth * @throws Exception */ @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { //super.configure(auth);// auth.inMemoryAuthentication()// .withUser("admin")// .password(passwordEncoder.encode("123456"))// .roles("admin")// .authorities("Role_admin")// .and()// .passwordEncoder(passwordEncoder);//配置BCrypt加密 auth.userDetailsService(customUserDetailsService); }

测试

使用账号密码结果为:

账号:admin。

密码:123456。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MySQL那些不常用的一些SQL语句
下一篇:分布式 PostgreSQL 集群(Citus),官方快速入门教程
相关文章