1、认识Spring Security
一、什么是Spring Security
Spring Security是一个Java框架,用于保护应用程序的安全性。它提供了一套全面的安全解决方案,包括身份验证、授权、防止攻击等功能。Spring Security基于过滤器链的概念,可以轻松地集成到任何基于Spring的应用程序中。它支持多种身份验证选项和授权策略,开发人员可以根据需要选择适合的方式。此外,Spring Security还提供了一些附加功能,如集成第三方身份验证提供商和单点登录,以及会话管理和密码编码等。总之,Spring Security是一个强大且易于使用的框架,可以帮助开发人员提高应用程序的安全性和可靠性。
Spring Security是一个框架,提供 认证(authentication)、授权(authorization) 和 保护,以抵御常见的攻击。它对保护命令式和响应式应用程序有一流的支持,是保护基于Spring的应用程序的事实标准
二、为什么要用Spring Security
SpringBoot 没有发布之前,Shiro 应用更加广泛,因为 Shiro 是一个强大且易用的 Java 安全框架,能够非常清晰的处理身份验证、授权、管理会话以及密码加密。利用其易于理解的API,可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。但是 Shiro 只是一个框架而已,其中的内容需要自己的去构建,前后是自己的,中间是Shiro帮我们去搭建和配置好的。
SpringBoot 发布后,随着其快速发展,Spring Security 重新进入人们的视野。SpringBoot 解决了 Spring Security 各种复杂的配置,Spring Security 在我们进行用户认证以及授予权限的时候,通过各种各样的拦截器来控制权限的访问,从而实现安全,也就是说 Spring Security 除了不能脱离 Spring,Shiro 的功能它都有。
在用户认证方面,Spring Security 框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID 和 LDAP 等。
在用户授权方面,Spring Security 提供了基于角色的访问控制和访问控制列表(Access Control List,ACL),可以对应用中的领域对象进行细粒度的控制。
我们的shiro也是用于认证授权的,但是SpringSecurity是我们的Spring全家桶的一位选手,是和SpringBoot与SpringCloud是完美集成的
2、集成Spring Security实现认证
首先我们要知道没有引入Spring Security依赖之前,我们的页面是能够正常访问的
现在我们如果要实现Spring Security需要引入依赖
<dependency>-->
<groupId>org.springframework.boot</groupId>-->
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
我们引入之后再启动一下项目,我们会发现我们突然多了一个登录页面,这个登录页面就是Security的,并且我们在控制台中可以看到一串密钥一样的东西
其实这个密钥是security给我们生成的一个密码,因为我们现在没有自定义,我们输入用户名: user,输入的密码就是控制台打印的,我们就可以进入我们的页面了,难道没有人觉得这是一个aop思想吗,就是在你访问页面的时候突然给你拦截了,看你是否登陆了,其实security内是一个过滤链,里面有十几种拦截器,这里我们就先不扒源码了,等我后面出Spring Security与JWT令牌的时候我们可以详细讲解一下,这里留一个悬念
一、使用配置文件
这里如果我们使用security提供的用户名密码是肯定不行的,所以我们可以通过springboot的核心配置文件来配置用户名密码
我们再重启之后就可以使用我们自定义的用户名和密码进行登录,控制台也不会给我们随机的密码了
二、java配置文件
而我们的登录页面也不可能使用人家给的,我们需要使用到自己的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
用户名:<input type="text" name="username">
<br/>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
<br/>
</form>
</body>
</html>
接下来就是我们的controller层,用于测试我们写一个请求
@RestController
public class MyController {
@RequestMapping("/test")
public String test(){
return "test";
}
}
开始我们的java配置文件
EnableWebSecurity注解: 启用Web安全配置的注解。当这个注解被应用到一个配置类上时,它会启用Spring Security的Web安全功能。
Configuration注解: 声明这是一个配置类
我们的第一个方法是来用于认证的,
inMemoryAuthentication是将我们的信息写入到内存中,这里写项目是不推荐的,如果用户多的话非常占用内存,所以等我们下一节会教大家另一种方式来写
passwordEncoder是定义一下我们的密码编码格式,因为一般我们的敏感数据是需要通过加密来实现的,不被加密的数据称为 明文,反过来就是密文
这里我们设置了一个用户名叫做admin,密码是通过BCryptPasswordEncoder类来把这个密码转成密文,我们可以打印一下看看是什么东西,然后给他一个角色,他是admin角色,这里也留一个悬念,我们下节会给大家讲
我们第二个方法其实就是用于授权的
第一开始我们设置了我们的登录页面是我们自己的,我的login.html是在static包下,所以可以使用/直接访问到,这里第一行的意思就是我们的登录页面是login.html,并且所有人都可以访问
第二行是我们的登录处理路径,就是我们输入完用户名密码提交的路径,这个也是所有人可以访问,如果当不了的话,我们的用户名和密码是传不过去的
第三行是我们的form表单上的用户名的输入框的name是username,所以这里也是username,password也是这样的
第四行是我们其他的任何一个请求都会被拦截,除了我们上面定义过的
http.csrf().disable();如果没有这行代码导致用户无法被认证。这行代码的含义是:关闭 csrf 防护 .SRF(Cross-site request forgery)跨站请求伪造,也被称为“OneClick Attack” 或者 Session Riding。通过伪造用户请求访问受信任站点的非法请求访问
@EnableWebSecurity
@Configuration
public class MySecurityConfig extends WebSecurityConfigurerAdapter
{
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.passwordEncoder(new BCryptPasswordEncoder())
.withUser("admin").password(new BCryptPasswordEncoder().encode("123456"))
.roles("admin");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin().loginPage("/login.html").permitAll()
.loginProcessingUrl("/login").permitAll()
.passwordParameter("password").usernameParameter("username");
http.authorizeRequests().anyRequest().authenticated();
http.csrf().disable();
}
}
我们通过这样的配置之后再次访问就可以跳转到我们的登录页面,下节课我们会详细讲解springSecurity,我们会使用到 jwt令牌是用于前后端分离使用到的,也会使用到我们的redis缓存,希望大家留一个关注,我们下次见
3、面试题
一、什么是Spring Security?核心功能?
Spring Security是一个基于Spring框架的安全框架,提供了完整的安全解决方案,包括认证、授权、攻击防护等功能。
其核心功能包括:
认证:提供了多种认证方式,如表单认证、HTTP Basic认证、OAuth2认证等,可以与多种身份验证机制集成。
授权:提供了多种授权方式,如角色授权、基于表达式的授权等,可以对应用程序中的不同资源进行授权。
攻击防护:提供了多种防护机制,如跨站点请求伪造(CSRF)防护、注入攻击防护等。
会话管理:提供了会话管理机制,如令牌管理、并发控制等。
监视与管理:提供了监视与管理机制,如访问日志记录、审计等。
Spring Security通过配置安全规则和过滤器链来实现以上功能,可以轻松地为Spring应用程序提供安全性和保护机制。
二、Spring Security的原理?
Spring Security是一个基于Spring框架的安全性认证和授权框架,它提供了全面的安全性解决方案,可以保护Web应用程序中的所有关键部分。
Spring Security的核心原理是拦截器(Filter)。Spring Security会在Web应用程序的过滤器链中添加一组自定义的过滤器,这些过滤器可以实现身份验证和授权功能。当用户请求资源时,Spring Security会拦截请求,并使用配置的身份验证机制来验证用户身份。如果身份验证成功,Spring Security会授权用户访问所请求的资源。
Spring Security的具体工作原理如下:
1.用户请求Web应用程序的受保护资源。
2.Spring Security拦截请求,并尝试获取用户的身份验证信息。
3.如果用户没有经过身份验证,Spring Security将向用户显示一个登录页面,并要求用户提供有效的凭据(用户名和密码)。
4.一旦用户提供了有效的凭据,Spring Security将验证这些凭据,并创建一个已认证的安全上下文(SecurityContext)对象。
5.安全上下文对象包含已认证的用户信息,包括用户名、角色和授权信息。
6.在接下来的请求中,Spring Security将使用已经认证的安全上下文对象来判断用户是否有权访问受保护的资源。
7.如果用户有权访问资源,Spring Security将允许用户访问资源,否则将返回一个错误信息。
三、有哪些控制请求访问权限的方法?
在Spring Security中,可以使用以下方法来控制请求访问权限:
permitAll():允许所有用户访问该请求,不需要进行任何身份验证。
denyAll():拒绝所有用户访问该请求。
anonymous():允许匿名用户访问该请求。
authenticated():要求用户进行身份验证,但是不要求用户具有任何特定的角色。
hasRole(String role):要求用户具有特定的角色才能访问该请求。
hasAnyRole(String... roles):要求用户具有多个角色中的至少一个角色才能访问该请求。
hasAuthority(String authority):要求用户具有特定的权限才能访问该请求。
hasAnyAuthority(String... authorities):要求用户具有多个权限中的至少一个权限才能访问该请求。
可以将这些方法应用于Spring Security的配置类或者在Spring Security注解中使用