图书馆管理系统功能实现第二阶段
语言: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 Listbooks){ 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("用户不存在") ; } ListgrantedAuthorities = 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,这个后面第三阶段会介绍到。到目前为止,从最开始的拦截器到现在的角色认证配置,全都用得上。想要完全掌握还是继续撸代码吧,代码地址在上面分享出来了。
至此,结束。