在后面的系列文章2.7.2中,已经创建了几个相关的,可以直接通过Doc或者.如:
GET http://localhost:9099/computer/1
访问此服务以获取 id 为 1 的笔记本的详细信息。
以下文章用于实现用户认证和授权。
1 add.1 添加依赖项
Boot很友好,已经管理好依赖版本,但是提供了集成的方法:
org.springframework.boot
spring-boot-starter-security
1.2 测试服务
添加依赖后重启服务,可以在控制台看到输出:
在浏览器中访问服务会手动跳转到默认提供的登录页面。手动跳转到浏览器地址栏:
:9099/登录。
在登录页面,用户名填写user,密码输入之前控制台北输出的密码。点击“登录”进入系统,显示笔记本详情。
2硬编码配置用户名和密码
我们使用的Boot版本是2.7.2,对应的版本是5.7.2,从5.7开始,使用Some变化,其中之一是配置时不推荐使用继承类。
demo中使用的用户名为user,密码是在启动时生成的,绝对不符合开发需要。用户名和密码的配置有三种形式:
在配置文件.yml中写入用户名和密码;定义配置类,这样写用户名和密码;实现,然后定义配置类进行配置。
后三个可以在演示中播放。
2.1在配置文件中配置用户名和密码
这些方法比较简单问道私服权限的数据库账号和密码,可以直接在.yml中配置:
spring:
profiles:
active: @env@
security:
user:
name: hero1
password: '111111'
roles: 'admin'
2.2在显存中配置用户名和密码
删除里面的节点相关配置,使用配置文件,配置在显存中生效的用户名和密码。
创建一个配置类:
package com.yygnb.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public InMemoryUserDetailsManager userDetailsService() {
UserDetails user = User.builder()
.username("hero2")
.password(passwordEncoder().encode("111111"))
.roles("admin")
.build();
return new InMemoryUserDetailsManager(user);
}
}
重启服务,在登录界面输入 hero2/ 进行测试。
这些方法也是硬编码的用户名和密码,实际开发中不会用到。所以,先把这个文件删掉,然后在旁边继续学习。
3 数据库配置用户名和密码
在开始本节之前,请确保删除之前的编译。
3.1 个数据库表
首先你需要定义表结构。
因为我这里是基于上面的boot2.7.2系列文章的demo,所以继续使用表格来定义表结构。亲爱的读者,您可以从上面获取demo基础项目,也可以联系我获取。也可以摆脱demo基础工程,自己创建数据库表结构问道私服权限的数据库账号和密码,如SQL语句、图形界面等。
在/db/demo/目录下创建一个文件demo–v2.xml,里面定义了对数据库的改动。
该文件定义了用户表并插入了三条数据。用户表只有四个数组:id字段、用户名、密码、名称,字段自行下拉。
重启服务,会手动生成表结构。
3.2 生成实体类
可以逆向生成,下面的代码可以复制。
com.yygnb.demo..用户
/**
* 用户表
*/
@Schema(title = "用户")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@Schema(title = "用户名")
@NotNull(message = "不能为空")
private String username;
@Schema(title = "密码")
@NotNull(message = "不能为空")
private String password;
@Schema(title = "姓名")
private String name;
}
3.3
com.yygnb.demo..:
public interface UserMapper extends BaseMapper {
}
//.xml:
至此,计划的工作就完成了,拿出来回去。
3.4
在
,认证和授权需要一个对象,该对象可以加密密码。
com.yygnb.demo..g:
@Configuration
public class PasswordEncoderConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
3.5 个实现套接字
提供了一个套接字: .这个插座只有一种方式。这样就可以查询数据库,根据用户名查询用户信息。就这样返回。是一个提供实现类User的。
创建一个类:pl,实现,并添加@注解。
com.yygnb.demo..impl.pl:
package com.yygnb.demo.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yygnb.demo.entity.User;
import com.yygnb.demo.mapper.UserMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.List;
@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 wrapper = new QueryWrapper();
wrapper.eq("username", username);
User user = this.userMapper.selectOne(wrapper);
if (user == null) {
throw new UsernameNotFoundException("根据用户名未查询到用户");
}
// 模拟查询权限
List authorities = AuthorityUtils.commaSeparatedStringToAuthorityList("admin");
return new org.springframework.security.core.userdetails.User(
user.getUsername(), passwordEncoder.encode(user.getPassword()), authorities);
}
}
如果是以前的版本,还需要定义类继承的配置,重绘技巧,设置成这个模式等等,现在的版本就不需要那些无聊的操作了。
重启服务以访问测试。
感谢您阅读本文。如果这篇文章给了你一点帮助或启发,请三连支持,点赞,关注,收藏。笔者会继续与大家分享更多干货
最新评论