在现今这个数码大展拳脚的时代,安全问题无疑是咱们这些搞软件开发的人需要谨慎应对的一块烫手山芋,无论是那些大型企业应用,还是那种小打小闹的个人项目,对我们宝贵的数据和服务的保护都显得尤为关键。
试想一下,若是没有咱这神奇的Spring Security保驾护航,那我们的每一个接口岂不成为了互联网世界里的羔羊,任由他人肆意挑战?这种情况想想就让人心惊胆战啊!因此,我们会想到在接口被调用时,能不能让咱的后端猜出是哪个家伙在捣鬼呢?这样就能有效防止别人胡乱开关我们的接口了。除了这个痛点之外,还有个问题就是如何判断是哪位用户触发的操作呢?这可真是给咱们带来了不小的困扰。这时,Spring Security横空出世,成了解决这些难题的救星。
作为Spring大家族中的一员猛将,Spring Security为我们提供了一整套周全且灵活多变的安全防御体系,让应用的安全防线固若金汤。本文中,我们就一起来探讨如何运用Spring Security来保卫我们的应用吧。从Spring Security的基础概念讲起,逐步介绍如何搭建出扎实的横向跨越式的Spring Security应用;接着深入讲解配置Spring Security的细节,以满足咱们接口防御和数据防护的各种需求。
文章目录
- 搭建Spring Security环境
- 第一步,创建spring boot应用
- 第二步,引入spring security的依赖
- 第三步,配置自定义的用户名和密码
搭建Spring Security环境
第一步,创建spring boot应用
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
我们首先创建一个springboot的应用,我们引入了一个web包这样的话,我们就可以通过HTTP的方式调用我们的接口。
里面我们可以给他新建一个实体类和一个接口类。用来验证我们的最基础的接口。
User实体类
public class User {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}
BasicController接口类
package com.masiyi.springsecuritydemo.demos.web;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class BasicController {// http://127.0.0.1:8080/hello?name=lisi@RequestMapping("/hello")@ResponseBodypublic String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {return "Hello " + name;}// http://127.0.0.1:8080/user@RequestMapping("/user")@ResponseBodypublic User user() {User user = new User();user.setName("theonefx");user.setAge(666);return user;}}
这个时候我们可以看到,我们只要在浏览器上输入这个地址。就可以返回我们服务里面的内容。那么这就有一个问题,就是说如果我们把这个服务发布在互联网上面,那不是谁都可以调用。所以他就没有一个安全防护的一个环节。
第二步,引入spring security的依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
我们在项目的pom文件中引入上面的maven代码,记得一定要刷新maven,并且重新启动项目。这样的话,相当于我们的系统就自动引入Spring security的jar包。引入了之后我们就可以直接使用。
可以看到自从引入了这个jar包之后,我们的启动的控制台就会多了一些额外的输出。我们可以看到里面有一个默认生成的密码。我们把它复制下来。
0b34de66-bec1-4a00-aea6-f2cc34e35b28
现在我们现在在浏览器上输入刚刚一样的内容。
http://localhost:8080/hello
就会发现我们已经无法直接请求到服务里面返回的内容了,而是直接给我们重定向了一个登录页面的地址。这个登录页面的地址是spring security自己生成的一个默认的登录页面。这个时候我们需要重新输入用户名和密码,用户名默认是user
。然后密码默认是我们刚刚控制台复制好的密码。
这个时候我们就会发现他又给我们从定向到了hello那个页面这样的话和我们第一步直接访问这个url。所看到的结果是一样的,那么他做了什么事呢?就是在我们访问这个结果之前多了一个登录的页面,这样的话就可以把我们所有系统的接口全部给做一层防护。只有在我们输入用户和密码正确的时候,它才会继续给我们访问系统的接口。
第三步,配置自定义的用户名和密码
大家可以看到我们刚刚控制台生成的密码其实是一个随机的字符串,它是security默认生成的,所以现在我们可以给它配一个默认的用户名和密码。我们可以在配置文件中输入以下的配置给他配置自定义的用户名和密码。
spring.security.user.name=wangfugui
spring.security.user.password=123123
我们在用我们自定义的用户名和密码登录成功之后,就可以访问我们项目中的任意一个地址。
完成以上三步,我们就成功引入了springsecurity,并制定了我们自己的用户名和密码。不过你们有没有想过,在实际的项目中,我们真的会将用户名和密码写在配置文件中吗?这显然是不可能的。我们肯定是将这些信息存放在数据库当中,然后用户进行登录时,我们会依据他们提供的用户名和密码来与数据库中的匹配,如果匹配成功,那就让他们登录成功,并赋予他们访问系统接口的权限。
我们还可以为系统添加一个注册的功能。但这个时候,我们就会面临一个新问题。既然我们的每个接口都被spring security拦截了,那我们的注册接口岂不是也要被拦截掉?这就引出了一个新的问题。到时候我们下一节课会教大家如何在spring security中具体配置哪些接口应该被拦截,哪些应该放行,即那些不需要登录就能直接访问的接口。