Spring Boot + Security + Mybatis 简单权限控制(入门 + 记录篇)

Spring Boot Security 权限

这两天研究了一下权限管理框架。。
查阅资料的过程中,JAVA中常用的安全框架有Shiro和Spring Security。Shiro比Spring Security学习起来更加简单,功能够用。而这两天的学习中,就我自己的体会而言,学习Spring Security还是有一定难度的。虽然它的扩展性非常的好,我们可以重载它默认的类,重写方法,达到我们要的结果。
本来这篇文章是准备记录一下搭建一个权限系统的完整过程的,但因为能力有限,对security了解还不是很透彻,这里就只贴出我查阅资料过程中,觉得写得好的一些博客,和一些自己的观点和看法。也方便日后自己查阅。


安全框架Shiro和Spring Security比较

点我


权限 + 认证框架组合

Spring Boot + Spring Security + JWT
Spring Boot + Spring Security + Oauth2


好的博客教程

基于springboot的security机制(自定义登录页面+基于内存身份认证+基于mybatis身份认证)

spring security的原理及教程

Spring Boot中使用 Spring Security 构建权限系统

写得很好,就是文章风格太乱

Mybatis的注解应用之关系映射

用户权限管理spring security

最后还是贴上我自己的demo

Git地址:https://github.com/xiangjiangcheng/spring-boot-demo1.git

目录截图:
这里写图片描述

demo中只是简单实现了用户登录才能访问对应资源 + 简单的权限控制,并没有结合数据库实现权限管理。大致的流程如下图所示:
这里写图片描述

这里说的简单权限控制指的是:
当你访问一个controller的时候,会被拦截,提示登录。登录成功后,判断该用户是否有权访问该controller。
实现方式是在配置文件手动配置,这种方式很不灵活。网上说在方法上面加注解,来控制权限,亦是如此。维护起来很麻烦。
具体代码查看demo中BrowerSecurityConfig.java 配置文件

/**
  * 重写该方法,设定用户访问权限
  * 用户身份可以访问 订单相关API
  * */
  @Override
  protected void configure(HttpSecurity http) throws Exception {
      http.authorizeRequests()
              .antMatchers("/orders/**").hasAnyRole("USER", "ADMIN")    //用户权限,管理员权限
              .antMatchers("/user/**").hasRole("ADMIN")    //管理员权限
              .anyRequest().authenticated() //任何请求,登录后可以访问
              .and()
              .formLogin()
              .loginPage("/login")    //跳转登录页面的控制器,该地址要保证和表单提交的地址一致!
              .successHandler(new AuthenticationSuccessHandler() {
                  // 通过SecurityContextHolder获取目前登录的用户信息,然后将其放到session中(不建议如此处理)然后将页面重定向到首页中。
                  @Override
                  public void onAuthenticationSuccess(HttpServletRequest arg0, HttpServletResponse arg1, Authentication arg2)
                          throws IOException, ServletException {
                      Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
                      if (principal != null && principal instanceof UserDetails) {
                          UserDetails user = (UserDetails) principal;
                          System.out.println("loginUser:"+user.getUsername());
                          //维护在session中
                          arg0.getSession().setAttribute("userDetail", user);
                          arg1.sendRedirect("/home");
                      }
                  }
              })
              //失败处理
              .failureHandler(new AuthenticationFailureHandler() {

                  @Override
                  public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException authenticationException)
                          throws IOException, ServletException {
                      System.out.println("error:"+authenticationException.getMessage());
                      response.sendRedirect("/login");
                  }
              })
              .permitAll()
              .and()
              .logout()
              .permitAll()  //注销行为任意访问
              .and()
              .csrf().disable();        //暂时禁用CSRF,否则无法提交表单
  }
实现Restful接口 不拦截

BrowerSecurityConfig.java 配置文件对应地方加入如下代码

 // 对于获取token的rest api要允许匿名访问
 .antMatchers("/auth/**").permitAll()
 .antMatchers("/druid/**").permitAll()
 .antMatchers(HttpMethod.GET, "/entries/**", "/articles/**").permitAll()
 // 除上面外的所有请求全部需要鉴权认证
 .anyRequest().authenticated();
注意

1.配置文件里面配置了每个controller对应的权限时,如

.antMatchers("/orders/**").hasAnyRole("USER", "ADMIN")    //用户权限
.antMatchers("/user/**").hasRole("ADMIN")    //管理员权限

那么数据库里面,对应的值必须是ROLE_USERROLE_ADMIN
这里写图片描述
2.开发过程中,可以开启secutity的debug模式,代码如下

// 使用debug模式
@EnableWebSecurity(debug = true)
// @EnableWebSecurity

这样,就能看到每次请求的详细信息,以及都经过哪些拦截器拦截!
这里写图片描述

小结

在我看来,web开发过程中,只要涉及到用户登录,再有权限分配这些功能,那么一套完整的权限管理系统已经是必不可少的了。

以往传统的权限系统,都是自己写一些拦截器,简单的实现了权限管理。说简单一点就是,写一个全局的拦截器,请求来之后,判断session中是否存在该用户,若session中没有该用户信息,则该资源不让访问,跳转到登录页面!

如果是使用权限框架,最重要的还是阅读文档和实践。只有了解了它的一些基础的原理,才能举一反三。

可以使用打断点的模式,了解框架到底是怎么在工作的,这能更快的了解他的工作流程。

很多关于Security的博客都写得不是很清楚。所谓的不清楚,也就是当我把一篇博客看完了后,我竟然没有一点思绪,还是不晓得从哪里入手。。。估计是我个人能力问题。

后面有时间再慢慢研究下使用框架实现权限和认证~~

Spring Boot 是一个用于构建微服务的开源框架,它能够快速搭建项目并且提供了许多便捷的功能和特性。Spring Security 是一个用于处理认证和授权的框架,可以保护我们的应用程序免受恶意攻击。JWT(JSON Web Token)是一种用于身份验证的开放标准,可以被用于安全地传输信息。Spring MVC 是一个用于构建 Web 应用程序的框架,它能够处理 HTTP 请求和响应。MyBatis 是一个用于操作数据库的框架,可以简化数据库操作和提高效率。Redis 是一种高性能的键值存储系统,可以用于缓存与数据存储。 基于这些技术,可以搭建一个商城项目。Spring Boot 可以用于构建商城项目的后端服务,Spring Security 可以确保用户信息的安全性,JWT 可以用于用户的身份验证,Spring MVC 可以处理前端请求,MyBatis 可以操作数据库,Redis 可以用于缓存用户信息和商品信息。 商城项目的后端可以使用 Spring BootSpring Security 来搭建,通过 JWT 来处理用户的身份验证和授权。数据库操作可以使用 MyBatis 来简化与提高效率,同时可以利用 Redis 来缓存一些常用的数据和信息,提升系统的性能。前端请求则可以通过 Spring MVC 来处理,实现商城项目的整体功能。 综上所述,借助于 Spring BootSpring Security、JWT、Spring MVC、MyBatis 和 Redis 这些技术,可以构建出一个高性能、安全可靠的商城项目,为用户提供良好的购物体验。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值