Fork me on GitHub

图书馆管理系统功能实现第二阶段

语言:JAVA

框架:Springboot + Mybatis

工具:redis  redis可视化工具

前端模拟工具:postman

前面第一篇已经初步实现图书馆管理系统的各个功能了,第二阶段给访问用户加上角色进行认证访问。第二阶段代码地址:https://github.com/yeyuting-1314/library-3.0.git

一、准备工作

1. 数据库设计

现在接着来创建用户角色表和用户角色关联表

CREATE TABLE library.`sys_role` (
    `id` bigint NOT NULL AUTO_INCREMENT comment '角色ID ',
    `role_name` varchar(50) comment '角色名',
    `role` varchar(50) comment '角色',
    PRIMARY KEY (`id`)
);
CREATE TABLE library.`sys_user_role` (
    `user_id` bigint default null comment '用户id ',
    `role_id` bigint default null comment '角色id'
);

在角色表中插入三个角色:

insert into library.sys_role values ('1','普通用户' , 'ROLE_USER');
insert into library.sys_role values ('2','普通管理员' , 'ROLE_ADMIN');
insert into library.sys_role values ('3','超级管理员','ROLE_SUPERADMIN');

二、正式工作

1. 接口分别给到不同的用户角色

controller层

UserController:这里给用户角色分配了五个接口

/**
 * @author yeyuting
 * @create 2021/2/25
 */
@RestController
@RequestMapping("sys/user")
public class UserController {

    @Autowired
    UserService userService ;

    //用户注册
    @PostMapping("/registerUser")
    public Result registerUser(@RequestBody SysUser sysUser){
        Result result = Results.successWithData(
                userService.RegisterUser(sysUser) , BaseEnums.SUCCESS.code() , BaseEnums.SUCCESS.desc()) ;
        return result ;
    }

    //普通用户登陆
    @RequestMapping("/login")
    public Result Login(@RequestBody SysUser sysUser){
        Result result = Results.successWithData
                (userService.Login(sysUser), BaseEnums.SUCCESS.code() , BaseEnums.SUCCESS.desc()) ;
        return  result ;
    }

    //用户角色 借阅书本
    @PostMapping("/borrowBooks")
    public Result borrowBooks(@RequestParam("bookCode") String bookCode ,
                              HttpServletRequest request) {
        Result result = Results.successWithData(userService.borrowBooks(bookCode ,request)) ;
        return result ;
    }

    //用户角色 还书
    @PostMapping("returnBooks")
    public Result returnBooks (@RequestParam("bookCode") String bookCode ,
                               HttpServletRequest request){
        Result result = Results.successWithData(userService.returnBooks(bookCode,request)) ;
        return result ;
    }

    //用户角色 查询所有书本
    @GetMapping("/selectAllBooks")
    public Result selectAllBooks(){
        Result result = Results.successWithData(userService.selectAllBooks()) ;
        return  result ;
    }

}

AdminController:普通管理员拥有2个接口的访问权限

/**
 * @author yeyuting
 * @create 2021/3/2
 */
@RestController
@RequestMapping("sys/admin")
public class AdminController {
    @Autowired
    UserService userService ;

    //管理员登陆
    @RequestMapping("/login")
    public Result Login(@RequestBody SysUser sysUser){
        Result result = Results.successWithData
                (userService.Login(sysUser), BaseEnums.SUCCESS.code() , BaseEnums.SUCCESS.desc()) ;
        return  result ;
    }

    //管理员权限  查看借阅记录
    @GetMapping("/selectAllBorrowingRecords")
    public  Result selectAllBorrowingRecords(){
        Result result = Results.successWithData(userService.selectAllBorrowingRecords())  ;
        return  result ;
    }


}

SuperAdminController:这里超级管理员获得三个接口访问权限

/**
 * @author yeyuting
 * @create 2021/3/2
 */
@RestController
@RequestMapping("sys/superAdmin")
public class SuperAdminController {

    @Autowired
    UserService userService ;

    //用户登陆
    @RequestMapping("/login")
    public Result Login(@RequestBody SysUser sysUser){
        Result result = Results.successWithData
                (userService.Login(sysUser), BaseEnums.SUCCESS.code() , BaseEnums.SUCCESS.desc()) ;
        return  result ;
    }

    //超级管理员权限  新增一本书本
    @PostMapping("/insertOneBook")
    public Result insertOneBook(@RequestBody Book book){
        Result result = Results.successWithData(userService.insertOneBook(book));
        return  result ;
    }

    //超级管理员  新增若干本书本
    @PostMapping("insertManyBooks")
    public  Result insertManyBooks(@RequestBody List<Book> books){
        Result result = Results.successWithData(userService.insertManyBooks(books)) ;
        return result ;
    }



}

2. 接下里对userServiceImpl进行补充

userServiceImpl实现UserDetailsService接口中方法loadUserByUsername方法:

@Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        SysUser user = userMapper.selectUserAndRoleByUserName(username) ;
        if(user.equals(null)){
            throw new UsernameNotFoundException("用户不存在") ;
        }
        List<GrantedAuthority> grantedAuthorities = new ArrayList<>() ;
        GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(user.getSysRole().getRole()) ;
        grantedAuthorities.add(grantedAuthority) ;
        return new org.springframework.security.core.userdetails.User(user.getUserName() ,
                new BCryptPasswordEncoder().encode(user.getUserPassword()) , grantedAuthorities) ;
    }

这里拿到对应角色后会进入权限配置中去对比是否具备相应角色。

3. SecurityConfiguration

/**
 * @author yeyuting
 * @create 2021/3/2
 */
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    UserServiceImpl userDetailService ;

    @Bean
    public PasswordEncoder passwordEncoder (){
        return new BCryptPasswordEncoder() ;
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        super.configure(web);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailService)
                .passwordEncoder(passwordEncoder()) ;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/sys/user/**" , "/sys/admin/**" , "/sys/superAdmin/**").hasAnyRole("USER" , "ADMIN" , "SUPERADMIN")
                .antMatchers("/sys/user/**").permitAll()
                .antMatchers("/sys/admin/**").hasRole("ADMIN")
                .antMatchers("/sys/superAdmin/**").hasRole("SUPERADMIN")
                .anyRequest().permitAll()//其他没有限定的请求,允许访问
                .and().anonymous()//对于没有配置权限的其他请求允许匿名访问
                .and().formLogin()//使用 spring security 默认登录页面
                .and().httpBasic();//启用http 基础验证
    }
}

这样一来,第二阶段的配置就配置好了,前端postman发权限申请时候要在Authoritation中填入信息,发起请求后才能被loadUserByUsername方法中的形参接到。

 

 后面可以通过自定义默认登陆页不用这个Authoritation,这个后面第三阶段会介绍到。到目前为止,从最开始的拦截器到现在的角色认证配置,全都用得上。想要完全掌握还是继续撸代码吧,代码地址在上面分享出来了。

至此,结束。

posted @ 2021-03-05 11:39  叶语婷  阅读(199)  评论(0编辑  收藏  举报