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角色可以访问";
    }

}
posted @ 2021-10-11 11:31  不是孩子了  阅读(91)  评论(0)    收藏  举报