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);
}
目录
相关文章
|
9天前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
113 2
|
5月前
|
人工智能 Java API
Spring AI 实战|Spring AI入门之DeepSeek调用
本文介绍了Spring AI框架如何帮助Java开发者轻松集成和使用大模型API。文章从Spring AI的初探开始,探讨了其核心能力及应用场景,包括手动与自动发起请求、流式响应实现打字机效果,以及兼容不同AI服务(如DeepSeek、通义千问)的方法。同时,还详细讲解了如何在生产环境中添加监控以优化性能和成本管理。通过Spring AI,开发者可以简化大模型调用流程,降低复杂度,为企业智能应用开发提供强大支持。最后,文章展望了Spring AI在未来AI时代的重要作用,鼓励开发者积极拥抱这一技术变革。
1895 71
Spring AI 实战|Spring AI入门之DeepSeek调用
|
7月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
361 0
|
6月前
|
安全 Java 数据库
Spring Security 实战指南:从入门到精通
本文详细介绍了Spring Security在Java Web项目中的应用,涵盖登录、权限控制与安全防护等功能。通过Filter Chain过滤器链实现请求拦截与认证授权,核心组件包括AuthenticationProvider和UserDetailsService,负责用户信息加载与密码验证。文章还解析了项目结构,如SecurityConfig配置类、User实体类及自定义登录逻辑,并探讨了Method-Level Security、CSRF防护、Remember-Me等进阶功能。最后总结了Spring Security的核心机制与常见配置,帮助开发者构建健壮的安全系统。
369 0
|
3月前
|
前端开发 Java API
基于 Spring Boot 3 与 React 的 Java 学生信息管理系统从入门到精通实操指南
本项目基于Spring Boot 3与React 18构建学生信息管理系统,涵盖前后端开发、容器化部署及测试监控,提供完整实操指南与源码,助你掌握Java全栈开发技能。
171 0
|
4月前
|
Java 关系型数据库 MySQL
【Spring】【事务】初学者直呼学会了的Spring事务入门
本文深入解析了Spring事务的核心概念与使用方法。Spring事务是一种数据库事务管理机制,通过确保操作的原子性、一致性、隔离性和持久性(ACID),维护数据完整性。文章详细讲解了声明式事务(@Transactional注解)和编程式事务(TransactionTemplate、PlatformTransactionManager)的区别与用法,并探讨了事务传播行为(如REQUIRED、REQUIRES_NEW等)及隔离级别(如READ_COMMITTED、REPEATABLE_READ)。
336 1
|
4月前
|
Java API 微服务
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
474 0
|
6月前
|
存储 安全 Java
Spring Security 入门与详解
Spring Security 是 Spring 框架中的核心安全模块,提供认证、授权及防护功能。本文详解其核心概念,包括认证(Authentication)、授权(Authorization)和过滤器链(Security Filter Chain)。同时,通过代码示例介绍基本配置,如 PasswordEncoder、UserDetailsService 和自定义登录页面等。最后总结常见问题与解决方法,助你快速掌握 Spring Security 的使用与优化。
1437 0
|
9月前
|
人工智能 自然语言处理 Java
Spring Cloud Alibaba AI 入门与实践
本文将介绍 Spring Cloud Alibaba AI 的基本概念、主要特性和功能,并演示如何完成一个在线聊天和在线画图的 AI 应用。
2322 7