springcloud 入门(10) Spring Security 安全与权限(上)

简介: springcloud 入门(10) Spring Security 安全与权限

目录

项目版本

1、jdk:1.8

2、springboot 2.1.6.RELEASE ,springcloud Greenwich.SR6

前言

应用权限概述权限,是整个微服务体系乃至软件业永恒的话题,有资源的地方,就有权限约束。

一、Spring Security是什么?

Spring Security 是 Spring Resource 社区的一个安全组件, Spring Security 为 JavaEE 企业红开发提供了全面的安全防护。安全防护是一个不断变化的目标, Spring Security 通过版本不断迭代来实现这一目标。 Spring Security 采用“安全层”的概念,使每一层都尽可能安全,连续的安全层可以达到全面的防护。 Spring Seeurity 可以在 Controller 层、 Service 层、 DAO 层等以加注解的方式来保护应用程序的安全。 Spring Security 提供了细粒度的权限控制,可以精细到每一个 API 接口、每一个业务的方法,或者每一个操作数据库的 DAO 层的方法。 Spring Security 提供的是应用程序层的安全解决方案,一个系统的安全还需要考虑传输层和系统层的安全,例如采用 Htpps 协议、服务器部署防火墙等。

Spring Security 是一个提供身份验证、授权和针对常见攻击的保护的框架。凭借对保护命令式和反应式应用程序的一流支持,它是保护基于 Spring 的应用程序的事实上的标准。

二、入门示例

消费者安全机制

1、创建cloud-security项目,引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

2、创建Spring Security配置

代码如下:

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        auth.inMemoryAuthentication().passwordEncoder(passwordEncoder)
                .withUser("root").password(passwordEncoder.encode("1234")).roles("USER")
                .and()
                .withUser("admin").password(passwordEncoder.encode("admin")).roles("USER", "ADMIN");
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.httpBasic().and().authorizeRequests().anyRequest().fullyAuthenticated();
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        // 禁用csrf,关闭劫持
        http.csrf().disable();
    }
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/actuator/hystrix.stream","/turbine.stream");
    }
}

3、eureka-consumer消费端引入cloud-security模块

<dependency>
            <groupId>site.sunlong</groupId>
            <artifactId>cloud-security</artifactId>
            <version>${project.version}</version>
        </dependency>

4、测试

浏览器输入消费端,http://localhost:7001/consumer/feign/hello,会出现Spring Security登录页面,输入用户名root,密码1234

image.png

出现如下页面,则表示成功

image.png

zuul 网关安全机制

实际项目中,对于服务接口的访问基本都是通过网关进行访问的,所以网关安全也很重要。

1、在之前的项目springcloud 项目搭建(6) 网关 zuul中添加Spring Security依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

2、修改配置文件

#spring security 配置
spring.security.user.name=zuul-user
spring.security.user.password=zuul-password

3、测试

分别启动eureka-server、zuul-gateway、user-provider,其中user-provider被zuul-gateway代理,

访问zuul-gateway的http://localhost:8501/zuul-proxy/user-providers-proxy/user/getUserName/55,弹出登录页面image.png

输入在zuul-gateway中配置的用户名密码,接口访问成功

image.png

Feign 安全机制

如果要通过Feign 访问接口的话也需要被调用方接口安全认证。

启动eureka-server、zuul-gateway、user-provider、eureka-consumer,其中user-provider被zuul-gateway代理,eureka-consumer通过zuul-gateway去调用user-provider的接口。

浏览器输入http://localhost:7001/consumer/feign/getUserName/hhh,如果未登录会出现上述消费者安全访问中的情况,登录过后会发现控制台出现以下报错信息

feign.FeignException$Unauthorized: status 401 reading UserProviderClientService#getUserName(String)
  at feign.FeignException.clientErrorStatus(FeignException.java:161)
  at feign.FeignException.errorStatus(FeignException.java:141)
  at feign.FeignException.errorStatus(FeignException.java:133)

报错原因是zuul-gateway的访问是需要用户名密码的,通过Feign 访问的时候没有认证授权,所以要添加认证授权的信息。

在eureka-consumer端修改FeignClientConfig配置文件,添加认证授权信息

代码如下:

@Configuration
public class FeignClientConfig {
    /**
     * feign 日志打印
     * @return
     */
    @Bean
    public Logger.Level getFeignLoggerLevel() {
        return feign.Logger.Level.FULL;
    }
    /**
     *  Feign访问zuul 认证授权
     * @return
     */
    @Bean
    public BasicAuthRequestInterceptor getBasicAuthRequestInterceptor() {
        return new BasicAuthRequestInterceptor("zuul-user", "zuul-password");
    }
}

重启eureka-consumer再次访问http://localhost:7001/consumer/feign/getUserName/hhh,访问成功

image.png

如果配置BasicAuthRequestInterceptor不起作用的话,可以在FeignClient注解的configuration属性添加FeignClientConfig

示例如下:

@FeignClient(name = "ZUUL-GATEWAY" , path = "zuul-proxy/user-providers-proxy/user"  ,fallbackFactory = UserProviderServiceFallbackFactory.class,configuration = FeignClientConfig.class)
public interface UserProviderClientService {
    @GetMapping("/getUserName/{username}")
    String getUserName(@PathVariable("username") String username);
}
目录
相关文章
|
26天前
|
Java Spring
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
|
19天前
|
缓存 Java Spring
Spring缓存实践指南:从入门到精通的全方位攻略!
【8月更文挑战第31天】在现代Web应用开发中,性能优化至关重要。Spring框架提供的缓存机制可以帮助开发者轻松实现数据缓存,提升应用响应速度并减少服务器负载。通过简单的配置和注解,如`@Cacheable`、`@CachePut`和`@CacheEvict`,可以将缓存功能无缝集成到Spring应用中。例如,在配置文件中启用缓存支持并通过`@Cacheable`注解标记方法即可实现缓存。此外,合理设计缓存策略也很重要,需考虑数据变动频率及缓存大小等因素。总之,Spring缓存机制为提升应用性能提供了一种简便快捷的方式。
25 0
|
22天前
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
54 0
|
25天前
|
Java Spring 容器
【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM
【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM
|
26天前
|
存储 Java Spring
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
|
26天前
|
SQL Java 数据库连接
【Azure Spring Cloud】Azure Spring Cloud connect to SQL using MSI
【Azure Spring Cloud】Azure Spring Cloud connect to SQL using MSI
|
26天前
|
Java 开发工具 Spring
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
|
26天前
|
NoSQL Java Redis
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
|
28天前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
|
22天前
|
人工智能 前端开发 Java
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
本文介绍了如何使用 **Spring Cloud Alibaba AI** 构建基于 Spring Boot 和 uni-app 的聊天机器人应用。主要内容包括:Spring Cloud Alibaba AI 的概念与功能,使用前的准备工作(如 JDK 17+、Spring Boot 3.0+ 及通义 API-KEY),详细实操步骤(涵盖前后端开发工具、组件选择、功能分析及关键代码示例)。最终展示了如何成功实现具备基本聊天功能的 AI 应用,帮助读者快速搭建智能聊天系统并探索更多高级功能。
167 2
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)