微服务技术系列教程(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.点击查询和添加链接,可以访问。但是删除和修改链接失败,因为代码里没有赋予其权限。

目录
相关文章
|
5月前
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
359 1
|
5月前
|
Kubernetes Java 微服务
Spring Cloud 微服务架构技术解析与实践指南
本文档全面介绍 Spring Cloud 微服务架构的核心组件、设计理念和实现方案。作为构建分布式系统的综合工具箱,Spring Cloud 为微服务架构提供了服务发现、配置管理、负载均衡、熔断器等关键功能的标准化实现。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
562 0
|
7月前
|
缓存 负载均衡 NoSQL
基于微服务架构的唯品会商品详情接口技术解析
本文介绍了唯品会电商平台商品详情接口的微服务化实现方案,涵盖架构设计、代码示例与性能优化策略。采用FastAPI构建服务,结合Redis缓存、异步处理、Nginx负载均衡等技术,实现高并发、低延迟的接口性能。
|
7月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
597 0
|
4月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
4月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
4月前
|
JavaScript Java 关系型数据库
基于springboot的古树名木保护管理系统
本研究针对古树保护面临的严峻挑战,构建基于Java、Vue、MySQL与Spring Boot技术的信息化管理系统,实现古树资源的动态监测、数据管理与科学保护,推动生态、文化与经济可持续发展。
|
4月前
|
监控 安全 JavaScript
2025基于springboot的校车预定全流程管理系统
针对传统校车管理效率低、信息不透明等问题,本研究设计并实现了一套校车预定全流程管理系统。系统采用Spring Boot、Java、Vue和MySQL等技术,实现校车信息管理、在线预定、实时监控等功能,提升学校管理效率,保障学生出行安全,推动教育信息化发展。

热门文章

最新文章