微服务技术系列教程(38)- SpringBoot -整合SpringSecurity

简介: 微服务技术系列教程(38)- SpringBoot -整合SpringSecurity

1. 引言

代码已提交至Github,有兴趣的同学可以下载看看:https://github.com/ylw-github/SpringBoot-Security-Demo

上一篇博客《微服务技术系列教程(37)- SpringBoot -SpringSecurity简介》主要讲解了SpringSecurity介绍以及应用场景。

本文主要讲解SpringBoot整合SpringSecurity,学习之前,先来了解一个概念“Basic认证”。

什么是Basic认证?

  1. 在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。
  2. 客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名及密码,然后将用户名及密码以BASE64加密,加密后的密文将附加于请求信息中,如当用户名为ylw,密码为:123456时,客户端将用户名和密码用“:”合并,并将合并后的字符串用BASE64加密为密文,并于每次请求数据时,将密文附加于请求头(Request Header)中。
  3. HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64加密的用户名和密码),解开请求包,对用户名及密码进行验证,如果用户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。

2. SpringBoot整合Security

2.1 添加依赖与配置

1.添加Maven依赖:

<parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.0.1.RELEASE</version>
 </parent>
 <!-- 管理依赖 -->
 <dependencyManagement>
     <dependencies>
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-dependencies</artifactId>
             <version>Finchley.M7</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>
     </dependencies>
 </dependencyManagement>
 <dependencies>
     <!-- SpringBoot整合Web组件 -->
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
     <dependency>
         <groupId>org.projectlombok</groupId>
         <artifactId>lombok</artifactId>
     </dependency>
     <!-- springboot整合freemarker -->
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-freemarker</artifactId>
     </dependency>
     <!-->spring-boot 整合security -->
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-security</artifactId>
     </dependency>
 </dependencies>
 <!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
 <repositories>
     <repository>
         <id>spring-milestones</id>
         <name>Spring Milestones</name>
         <url>https://repo.spring.io/libs-milestone</url>
         <snapshots>
             <enabled>false</enabled>
         </snapshots>
     </repository>
 </repositories>

2.application.yml

# 配置freemarker
spring:
  freemarker:
    # 设置模板后缀名
    suffix: .ftl
    # 设置文档类型
    content-type: text/html
    # 设置页面编码格式
    charset: UTF-8
    # 设置页面缓存
    cache: false
    # 设置ftl文件路径
    template-loader-path:
      - classpath:/templates
  # 设置静态文件路径,js,css等
  mvc:
    static-path-pattern: /static/**

3.前端资源

4.请求Controller

@Controller
public class OrderController {
  // 首页
  @RequestMapping("/")
  public String index() {
    return "index";
  }
  // 查询订单
  @RequestMapping("/showOrder")
  public String showOrder() {
    return "showOrder";
  }
  // 添加订单
  @RequestMapping("/addOrder")
  public String addOrder() {
    return "addOrder";
  }
  // 修改订单
  @RequestMapping("/updateOrder")
  public String updateOrder() {
    return "updateOrder";
  }
  // 删除订单
  @RequestMapping("/deleteOrder")
  public String deleteOrder() {
    return "deleteOrder";
  }
  // 自定义登陆页面
  @GetMapping("/login")
  public String login() {
    return "login";
  }
}

2.2 Security配置

配置两个账号并配置每个路径配置拦截请求资源:

  • 账号admin:可以对订单进行增删改查
  • 账号userAdd :只能对订单进行查询和添加

配置详情如下:

// Security 配置
@Component
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  @Autowired
  private MyAuthenticationFailureHandler failureHandler;
  @Autowired
  private MyAuthenticationSuccessHandler successHandler;
  // 配置认证用户信息和权限
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    // 添加admin账号
    auth.inMemoryAuthentication().withUser("admin").password("123456").
    authorities("showOrder","addOrder","updateOrder","deleteOrder");
    // 添加userAdd账号
    auth.inMemoryAuthentication().withUser("userAdd").password("123456").authorities("showOrder","addOrder");
    // 如果想实现动态账号与数据库关联 在该地方改为查询数据库
  }
  // 配置拦截请求资源
  protected void configure(HttpSecurity http) throws Exception {
    // 如何权限控制 给每一个请求路径 分配一个权限名称 让后账号只要关联该名称,就可以有访问权限
    http.authorizeRequests()
    // 配置查询订单权限
    .antMatchers("/showOrder").hasAnyAuthority("showOrder")
    .antMatchers("/addOrder").hasAnyAuthority("addOrder")
    .antMatchers("/login").permitAll()
    .antMatchers("/updateOrder").hasAnyAuthority("updateOrder")
    .antMatchers("/deleteOrder").hasAnyAuthority("deleteOrder")
    .antMatchers("/**").fullyAuthenticated().and().formLogin().loginPage("/login").
    successHandler(successHandler).failureHandler(failureHandler)
    .and().csrf().disable();
  }
  @Bean
  public static NoOpPasswordEncoder passwordEncoder() {
    return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
  }
}

2.3 权限不足配置

1.控制器页面请求跳转

@Controller
public class ErrorController {
  // 403权限不足页面
  @RequestMapping("/error/403")
  public String error() {
    return "/error/403";
  }
}

2.自定义WEB 服务器参数

/**
 * 自定义 WEB 服务器参数 可以配置默认错误页面
 */
@Configuration
public class WebServerAutoConfiguration {
  @Bean
  public ConfigurableServletWebServerFactory webServerFactory() {
    TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
    ErrorPage errorPage400 = new ErrorPage(HttpStatus.BAD_REQUEST, "/error/400");
    ErrorPage errorPage401 = new ErrorPage(HttpStatus.UNAUTHORIZED, "/error/401");
    ErrorPage errorPage403 = new ErrorPage(HttpStatus.FORBIDDEN, "/error/403");
    ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error/404");
    ErrorPage errorPage415 = new ErrorPage(HttpStatus.UNSUPPORTED_MEDIA_TYPE, "/error/415");
    ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500");
    factory.addErrorPages(errorPage400, errorPage401, errorPage403, errorPage404, errorPage415, errorPage500);
    return factory;
  }
}

2.4 认证成功或者失败处理

认证失败接口:AuthenticationFailureHandler

//认证失败
@Component
public class MyAuthenticationFailureHandler implements AuthenticationFailureHandler {
  public void onAuthenticationFailure(HttpServletRequest req, HttpServletResponse res, AuthenticationException auth)
      throws IOException, ServletException {
    System.out.println("登陆失败!");
    res.sendRedirect("http://baidu.com");
  }
}

认证成功接口:AuthenticationSuccessHandler

// 认证成功
@Component
public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
  public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse res, Authentication arg2)
      throws IOException, ServletException {
    System.out.println("用户认证成功");
    res.sendRedirect("/");
  }
}

3. 启动测试

1.浏览器输入:http://localhost:8080,可以由于权限配置,看到自动跳转到了登录界面。

自动跳转到了登录界面:

3.1 使用admin测试

1.登录页面输入账号admin、密码123456,进入了订单系统

2.点击4个链接,均能访问,因为已经分配所有权限给admin了。

3.1 使用useAdd测试

1.登录页面输入账号userAdd、密码123456,进入了订单系统

2.点击查询和添加链接,可以访问。但是删除和修改链接失败,因为代码里没有赋予其权限。

目录
相关文章
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
629 0
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
468 0
|
7月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1341 5
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
668 70
|
9月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
278 2
|
消息中间件 存储 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
本教程介绍ActiveMQ的安装与基本使用。首先从官网下载apache-activemq-5.15.3版本,解压后即可完成安装,非常便捷。启动时进入解压目录下的bin文件夹,根据系统选择win32或win64,运行activemq.bat启动服务。通过浏览器访问`http://127.0.0.1:8161/admin/`可进入管理界面,默认用户名密码为admin/admin。ActiveMQ支持两种消息模式:点对点(Queue)和发布/订阅(Topic)。前者确保每条消息仅被一个消费者消费,后者允许多个消费者同时接收相同消息。
475 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
|
消息中间件 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
542 0
|
消息中间件 网络协议 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ集成
本文介绍了在 Spring Boot 中集成 ActiveMQ 的详细步骤。首先通过引入 `spring-boot-starter-activemq` 依赖并配置 `application.yml` 文件实现基本设置。接着,创建 Queue 和 Topic 消息类型,分别使用 `ActiveMQQueue` 和 `ActiveMQTopic` 类完成配置。随后,利用 `JmsMessagingTemplate` 实现消息发送功能,并通过 Controller 和监听器实现点对点消息的生产和消费。最后,通过浏览器访问测试接口验证消息传递的成功性。
863 0
|
消息中间件 Java API
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ—— JMS 和 ActiveMQ 介绍
本文介绍如何在Spring Boot中集成ActiveMQ,首先阐述了JMS(Java消息服务)的概念及其作为与具体平台无关的API在异步通信中的作用。接着说明了JMS的主要对象模型,如连接工厂、会话、生产者和消费者等,并指出JMS支持点对点和发布/订阅两种消息类型。随后重点讲解了ActiveMQ,作为Apache开源的消息总线,它完全支持JMS规范,适用于异步消息处理。最后,文章探讨了在Spring Boot中使用队列(Queue)和主题(Topic)这两种消息通信形式的方法。
410 0
|
6月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
下一篇
开通oss服务