spring security
官网介绍
security是一款用于认证和授权模块的代码,对web应用提供防护支持。具体的请查看官网内容。
引入spring-security
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
引入后默认自动开发了安全验证
测试
package com.example.securitydemo01.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* *@ClassName homeController
* *@Author yyc
* *@Date 2020/5/20 11:34
**/
@RestController
public class homeController {
@GetMapping("/")
public String Index(){
return "home";
}
}
访问localhost:8081/ 弹出需要输入验证用户和密码
用户名默认是user
密码在控制台输出
输入用户和密码后,转到对应的url地址
可以看出,我们只要引入spring-security,就默认开启了表单验证。
如果使用简单的验证,需要手动配置
package com.example.securitydemo01.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
/**
* *@ClassName webSecurityConfig
* *@Author yyc
* *@Date 2020/5/20 14:37
**/
@Configuration
public class webSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception{
http.httpBasic()//简单认证
.and()
.authorizeRequests()//授权配置
.anyRequest()//所有请求
.authenticated();//都需要认证
}
}
如果想要实现表单验证,需要将httpBasic改成formlogin
@Override
protected void configure(HttpSecurity http) throws Exception{
http.formLogin()//表单认证
.and()
.authorizeRequests()//授权配置
.anyRequest()//所有请求
.authenticated();//都需要认证
}
原理
表单验证流程
- 首先用户发送一个未授权的请求来获取一个未授权的资源。比如访问localhost:8082/
- spring-security的安全过滤拦截器检测到当前的请求是未授权的,然后抛出一个AccessDeniedException错误
- 只要检测到用户点击是未授权的,ExceptionTranslationFilter初始开始授权的程序,并发送一个login请求
- 浏览器响应login.html页面
- 用户输入用户名和密码登录到应用