08-基于jdbc的用户认证的实现
1、创建数据库和表

2、编写配置文件,连接数据库
spring:
datasource:
url: jdbc:mysql://localhost:3306/db3
username: root
password: "2000820."
driver-class-name: com.mysql.cj.jdbc.Driver
3、编写实体类

4、编写dao接口:通过用户名进行查找user

5、编写service接口和其实现类


6、实现UserDetailsService接口,在方法中获取数据库的用户信息,进行数据库的查询
@Component
public class MyUserDetailService implements UserDetailsService {
//注入dao接口
@Autowired
private UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//自己写的User
UserInfo userInfo = null;
//安全框架提供的User
/*
因为返回值是UserDetails,User是UserDetails的实现类
*/
User user = null;
if(username != null){
userInfo = userMapper.findByName(username);
if(userInfo != null){
List<GrantedAuthority> list = new ArrayList<>();
//角色必须以ROLE_开头
GrantedAuthority authority = new SimpleGrantedAuthority("ROLE_" + userInfo.getRole());
list.add(authority);
//创建user对象(安全框架提供的user对象)
user = new User(userInfo.getUsername(), userInfo.getPassword(), list);
}
}
return user;
}
}
7、编写配置类

但是自动注入UserDetailsService后报错,原因是有多个UserDetailsService,所以我们要给我们编写的MyUserDetailsService指定一个名称

然后再回到我们的配置类,指定名称即可

8、继续编写我们的配置类,将自动注入的对象添加到重写方法中的参数位置

9、编写controller
@RestController
public class HelloController {
@RequestMapping("/hello")
public String sayHello(){
return "使用内容中的用户信息";
}
//指定normal和admin角色都可以访问
@RequestMapping("helloUser")
@PreAuthorize(value = "hasAnyRole('admin', 'normal')")
public String helloCommonUser(){
return "normal和admin角色都可以访问";
}
//指定admin角色可以访问
@RequestMapping("/helloAdmin")
@PreAuthorize(value = "hasAnyRole('admin')")
public String helloAdmin(){
return "admin角色可以访问";
}
}

浙公网安备 33010602011771号