当前位置:   article > 正文

springcloud之SpringSecurity安全访问_springcloud security

springcloud security

原文地址:SpringCloud学习之路(二)-SpringSecurity安全访问_hsrlzg的博客-CSDN博客

SpringSecurity 安全访问(配置安全验证、服务消费端处理、无状态 Session 配置、定义公共安全配置程序类)

1、概念:SpringSecurity 安全访问

2、具体内容

所有的 Rest 服务最终都是暴露在公网上的,也就是说如果你的 Rest 服务属于一些你自己公司的私人业务,这样的结果会直接 导致你信息的泄漏,所以对于 Rest 访问,安全性是首要的因素。

2.1 配置安全验证

如果要想进行安全的验证处理,那么首先一定要先在服务的提供方上进行处理。

1、 【microcloud-provider-dept-8001】

修改 pom.xml 配置文件,追加 SpringSecurity 相关依赖包引入:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-security</artifactId>
  4. </dependency>

配置了安全框架,在启动时会出现有如下的一个提示信息:

Using default security password: 75f5d975-0cfc-16e9-b9cc-68fbb0b56465

2、 【microcloud-provider-dept-8001】

修改 application.yml 配置文件,进行安全的用户名配置:

  1. security:
  2. basic:
  3. enabled: true # 启用SpringSecurity的安全配置项
  4. user:
  5. name: studyjava # 认证用户名
  6. password: hello # 认证密码
  7. role: # 授权角色
  8. - USER

随后在项目之中访问 Rest 服务接口:http://dept-8001.com:8001/dept/list,此时在访问的时候会直接询问用户要求用户输入用户 名以及密码。

 有一种更简化的方法进行内容的输入:http:/studyjava:hello@dept-8001.com:8001/dept/list

2.2 服务消费端处理

 在实际的开发之中,对于 Rest 服务提供者是不可能被用户直接进行访问的,于是肯定需要有一个 Rest 客户端(WEB 端、 SpringBoot)进行调用,可是现在 Rest 提供者的服务上有了认证信息,那么该如何访问呢?

 public static final String DEPT_GET_URL = "http://studyjava:hello@dept-8001.com:8001/dept/get/";

 如果这个时候在 Rest 客户端上直接使用用户名和密码做加密处理,那么根本就无法进行访问,此时会出现有 401 的错误代码, 因为认证出现了错误。之所以无法访问,是因为所有的认证的处理操作,应该以头信息的模式来进行处理。而后要使用Base64进行加密处理后才可以得到一个正确的访问路径。

 2.2.1 【microcloud-consumer-80】

修改 RestConfig 配置类,在这个配置类上追加有新的 Bean 配置项HttpHeaders 

  1. security:
  2. basic:
  3. enabled: true # 启用SpringSecurity的安全配置项
  4. user:
  5. name: studyjava # 认证用户名
  6. password: hello # 认证密码
  7. role: # 授权角色
  8. - USER

2.2.2 【microcloud-consumer-80】

修改 ConsumerDeptController 配置类,在进行 Rest 访问的时候设置好这个头部的信息

  1. package cn.study.microcloud.controller;
  2. import java.util.List;
  3. import javax.annotation.Resource;
  4. import org.springframework.http.HttpEntity;
  5. import org.springframework.http.HttpHeaders;
  6. import org.springframework.http.HttpMethod;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import org.springframework.web.client.RestTemplate;
  10. import cn.study.vo.Dept;
  11. @RestController
  12. public class ConsumerDeptController {
  13. public static final String DEPT_GET_URL = "http://dept-8001.com:8001/dept/get/";
  14. public static final String DEPT_LIST_URL = "http://dept-8001.com:8001/dept/list/";
  15. public static final String DEPT_ADD_URL = "http://dept-8001.com:8001/dept/add?dname=";
  16. @Resource
  17. private RestTemplate restTemplate;
  18. @Resource
  19. private HttpHeaders headers;
  20. @RequestMapping(value = "/consumer/dept/get")
  21. public Object getDept(long id) {
  22. Dept dept = this.restTemplate
  23. .exchange(DEPT_GET_URL + id, HttpMethod.GET,
  24. new HttpEntity<Object>(this.headers), Dept.class)
  25. .getBody();
  26. return dept;
  27. }
  28. @SuppressWarnings("unchecked")
  29. @RequestMapping(value = "/consumer/dept/list")
  30. public Object listDept() {
  31. List<Dept> allDepts = this.restTemplate
  32. .exchange(DEPT_LIST_URL, HttpMethod.GET,
  33. new HttpEntity<Object>(this.headers), List.class)
  34. .getBody();
  35. return allDepts;
  36. }
  37. @RequestMapping(value = "/consumer/dept/add")
  38. public Object addDept(Dept dept) throws Exception {
  39. Boolean flag = this.restTemplate.exchange(DEPT_ADD_URL, HttpMethod.POST,
  40. new HttpEntity<Object>(dept, this.headers), Boolean.class)
  41. .getBody();
  42. return flag;
  43. }
  44. }

 2.3 无状态 Session 配置

 通过之前一系列的演示可以发现整个 Rest 项目中的一个问题所在,所有的 Rest 都是基于 HTTP 协议的一种应用,而在这种应 用上,所有的 WEB 容器一般都会提供有一个 Session 的机制,也就是说每一个用户访问之后如果该用户一直连接,则认为该用户 应该一直被服务器保存状态,但是微服务有可能同时并发访问几十万人,那么如果所有的 Session 状态都被维护着就会出现内存泄漏

2.3.1 【microcloud-provider-dept-8001】

现在修改 Rest 程序类,追加一个取得 session id 的方法:

  1. package cn.study.microcloud.rest;
  2. import javax.annotation.Resource;
  3. import javax.servlet.http.HttpServletRequest;
  4. import org.springframework.web.bind.annotation.PathVariable;
  5. import org.springframework.web.bind.annotation.RequestBody;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RequestMethod;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import cn.study.microcloud.service.IDeptService;
  10. import cn.study.vo.Dept;
  11. @RestController
  12. public class DeptRest {
  13. @Resource
  14. private IDeptService deptService ;
  15. @RequestMapping("/dept/sessionId")
  16. public Object id(HttpServletRequest request) {
  17. return request.getSession().getId() ;
  18. }
  19. @RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
  20. public Object get(@PathVariable("id") long id) {
  21. return this.deptService.get(id) ;
  22. }
  23. @RequestMapping(value="/dept/add",method=RequestMethod.POST)
  24. public Object add(@RequestBody Dept dept) {
  25. return this.deptService.add(dept) ;
  26. }
  27. @RequestMapping(value="/dept/list",method=RequestMethod.GET)
  28. public Object list() {
  29. return this.deptService.list() ;
  30. }
  31. }

 随后进行提供者的 Rest 连接访问:http://studyjava:hello@dept-8001.com:8001/dept/sessionId;会发现每访问一次就会出现不同的session id

2.3.2 保持 Session 状态

在有一些的 SpringCloud 的配置之中,默认是会保存有 Session 状态的,而后如果用户有需要则可以根据“SessionCreationPolicy” 枚举类进行不同的 session 状态设置,但是从整体的操作来说,session 最好设置为无状态。

以下为保持 Session 状态(服务器内存有可能被占满):

  1. security:
  2. sessions: always

以下为无状态的 Session 设置(服务器不保存 Session 状态,每一次连接都是一个新的用户):

  1. security:
  2. sessions: stateless

 不管以后的项目或者支持类中是否有设置无状态的问题,最好都进行一下设置,否则 Rest 服务将受到严重的内存困扰,最严重的问题就是内存溢出。

2.4 定义公共安全配置程序类

 在进行 Rest 服务开发的时候,为了保证安全所有的程序里面都需要进行 Spring-Security 安全认证处理,可是之前所进行的认 证处理都是在 application.yml 配置文件完成的,这样的配置明显是非常不合乎逻辑的,因为如果此时你要开发的微服务很多,并且 这些微服务都要求使用统一的用户名和密码的时候就非常不方便了。所以现在最简单的做法是进行统一的设置。

2.4.1 创建一个 microcloud-security 的 Maven 模块;

2.4.2 【microcloud-security】

修改 pom.xml 配置文件添加spring-boot-starter-security:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-security</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework</groupId>
  12. <artifactId>springloaded</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-devtools</artifactId>
  17. </dependency>
  18. </dependencies>

2.4.3 【microcloud-security】建立一个统一的安全配置类:

  1. package cn.study.microcloud.config;
  2. import javax.annotation.Resource;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  5. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  6. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  7. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  8. import org.springframework.security.config.http.SessionCreationPolicy;
  9. @Configuration
  10. @EnableWebSecurity
  11. public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  12. @Resource
  13. public void configGlobal(AuthenticationManagerBuilder auth)
  14. throws Exception {
  15. auth.inMemoryAuthentication().withUser("studyjava").password("hello")
  16. .roles("USER").and().withUser("admin").password("hello")
  17. .roles("USER", "ADMIN");
  18. }
  19. @Override
  20. protected void configure(HttpSecurity http) throws Exception {
  21. // 表示所有的访问都必须进行认证处理后才可以正常进行
  22. http.httpBasic().and().authorizeRequests().anyRequest()
  23. .fullyAuthenticated();
  24. // 所有的Rest服务一定要设置为无状态,以提升操作性能
  25. http.sessionManagement()
  26. .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
  27. }
  28. }

2.4.4 【microcloud-provider-dept-8001】

修改 pom.xml 配置文件,引入安全配置模块:

  1. <dependency>
  2. <groupId>cn.study</groupId>
  3. <artifactId>microcloud-security</artifactId>
  4. </dependency>

2.4.5 【microcloud-provider-dept-8001】

删除掉 application.yml 中与安全有关的配置项(以下内容删除);

  1. security:
  2. sessions: stateless
  3. basic:
  4. enabled: true # 启用SpringSecurity的安全配置项
  5. user:
  6. name: studyjava # 认证用户名
  7. password: hello # 认证密码
  8. role: # 授权角色
  9. - USER

 由于现在所写的安全处理类是在程序启动类的子包之中,应该可以自动扫描到。

2.4.6 访问地址

http://mldnjava:hello@dept-8001.com:8001/dept/sessionId

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/951311
推荐阅读
相关标签
  

闽ICP备14008679号