在前面 SpringBoot 22 的系列文章中(进主要查看),已经创建了几个 puter 相关的接口,这些接口直接通过 Spring Doc 或 POSTMAN 就可以访问。例如:
GET http://localhost:9099/puter/1
访问该服务可以获取 id 为 1 的电脑详情。
接下来的文章就使用 Spring Security 实现用户认证和授权。
1 添加 Spring Security
1springframework2 测试服务
添加依赖后重新启动服务,可以在控制台看到输出:
在浏览器中访问该服务,会自动跳转到登录页面,该页面是 Spring Security 默认提供的。浏览器中地址栏自动跳转到:
http://localhost:9099/login。
在登录页面,用户名填写 user,密码填写上面控制台中输出的密码,点击“Sign in”,便会进入系统,显示电脑详情。
2 硬编码配置用户名和密码
咱们使用的 Spring Boot 版本是 22,对应的 Spring Security 版本为 52,从 5yml 中写死用户名和密码;
前面两者在 demo 中玩玩就行。
2yml 中配置即可:
spring:
profiles:
active: @env@
security:
user:
name: hero1
password: '111111'
roles: 'admin'
2yygnbconfig; import orgcontextBean; import orgcontextConfiguration; import orgsecurityuserdetailsspringframeworkcoreUserDetails; import orgsecuritybcryptspringframeworkcryptoPasswordEncoder; import orgsecurityInMemoryUserDetailsManager; @Configuration public class SecurityConfig { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean public InMemoryUserDetailsManager userDetailsService() { UserDetails user = Userusername("hero2") encode("111111")) build(); return new InMemoryUserDetailsManager(user); } }
重启服务,登录界面输入 hero2/111111 进行测试。
这种方式也是写死的用户名密码,在实际开发中不会使用的。所以,先删除这个文件,然后再继续后面的学习。
3 数据库配置用户名和密码
在开始这个部分之前,请确保删除了上面编写的 SecurityConfig。
37xml,该文件用来定义这次数据库的变更。
可以通过逆向工程生成,可以复制下面的代码。 demoUser demoUserMapper: resources/mapper/UserMapper0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis0//EN" "http://mybatisdtd">
<mapper namespace="demoUserMapper">
</mapper> 到这一步,准备工作就完成了,接下来继续回到 Spring Security。 Spring Security 提供了一个接口:UserDetailsService 。该接口只有一个方法 loadUserByUsername,在该方法中就可以查询数据库,根据用户名查询用户信息了。该方法返回 UserDetails。UserDetails 是一个接口,Spring Security 提供了一个实现类 User。 创建类:UserDetailsServiceImpl,实现 UserDetailsService 接口,并添加 @Service 注解。 demoimplyygnbservicebaomidoucorequeryyygnbentityyygnbmapperRequiredArgsConstructor;
import orgsecurityGrantedAuthority;
import orgsecurityauthorityspringframeworkcoreUserDetails;
import orgsecurityuserdetailsspringframeworkcoreUsernameNotFoundException;
import orgsecuritypasswordspringframeworkService;
import javaList;
@RequiredArgsConstructor
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
// @Autowired
private final PasswordEncoder passwordEncoder;
private final UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapperuserMappermaSeparatedStringToAuthorityList("admin");
return new orgsecurityuserdetailsgetUsername(), passwordEncodergetPassword()), authorities);
}
}
<?xml version="1w3liquibaseliquibaseliquibase12 生成实体类
/**
* 用户表
*/
@Schema(title = "用户")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType3 Mapper
public interface UserMapper extends BaseMapper<User> {
}
3yygnbconfig5 实现 UserDetailsService 接口
如果是以前版本的 Spring Security,还需要定义配置继承自 WebSecurityConfigurerAdapter 类,重写 config 方法,并在该方法中设置 UserDetailsService 等。现在的版本不需要这些无聊的操作了。
重启服务,访问测试。
感谢你阅读本文,如果本文给了你一点点帮助或者启发,还请三连支持一下,点赞、关注、收藏,作者会持续与大家分享更多干货