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);
}
目录
相关文章
|
1月前
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
313 5
|
3天前
|
人工智能 安全 Java
AI 时代:从 Spring Cloud Alibaba 到 Spring AI Alibaba
本次分享由阿里云智能集团云原生微服务技术负责人李艳林主讲,主题为“AI时代:从Spring Cloud Alibaba到Spring AI Alibaba”。内容涵盖应用架构演进、AI agent框架发展趋势及Spring AI Alibaba的重磅发布。分享介绍了AI原生架构与传统架构的融合,强调了API优先、事件驱动和AI运维的重要性。同时,详细解析了Spring AI Alibaba的三层抽象设计,包括模型支持、工作流智能体编排及生产可用性构建能力,确保安全合规、高效部署与可观测性。最后,结合实际案例展示了如何利用私域数据优化AI应用,提升业务价值。
|
26天前
|
存储 安全 Java
Spring Security 入门
Spring Security 是 Spring 框架中的安全模块,提供强大的认证和授权功能,支持防止常见攻击(如 CSRF 和会话固定攻击)。它通过过滤器链拦截请求,核心概念包括认证、授权和自定义过滤器。配置方面,涉及密码加密、用户信息服务、认证提供者及过滤器链设置。示例代码展示了如何配置登录、注销、CSRF防护等。常见问题包括循环重定向、静态资源被拦截和登录失败未返回错误信息,解决方法需确保路径正确和添加错误提示逻辑。
Spring Security 入门
|
27天前
|
SpringCloudAlibaba Dubbo Java
【SpringCloud Alibaba系列】Dubbo基础入门篇
Dubbo是一款高性能、轻量级的开源Java RPC框架,提供面向接口代理的高性能RPC调用、智能负载均衡、服务自动注册和发现、运行期流量调度、可视化服务治理和运维等功能。
【SpringCloud Alibaba系列】Dubbo基础入门篇
|
14天前
|
人工智能 自然语言处理 Java
Spring Cloud Alibaba AI 入门与实践
本文将介绍 Spring Cloud Alibaba AI 的基本概念、主要特性和功能,并演示如何完成一个在线聊天和在线画图的 AI 应用。
192 7
|
1月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
80 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
1月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
168 5
|
1月前
|
Java 数据库连接 数据库
从入门到精通---深入剖析Spring DAO
在Java企业级开发中,Spring框架以其强大的功能和灵活性,成为众多开发者的首选。Spring DAO(Data Access Object)作为Spring框架中处理数据访问的重要模块,对JDBC进行了抽象封装,极大地简化了数据访问异常的处理,并能统一管理JDBC事务。本文将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring DAO,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
28 1
|
2月前
|
监控 Java 数据安全/隐私保护
如何用Spring Boot实现拦截器:从入门到实践
如何用Spring Boot实现拦截器:从入门到实践
60 5
|
2月前
|
安全 Java 测试技术
如何在 Spring Boot 中禁用 Actuator 端点安全?
如何在 Spring Boot 中禁用 Actuator 端点安全?
232 1