简介
一般Web应用的需要进行认证和授权。
认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户
授权:经过认证后判断当前用户是否有权限进行某个操作
准备工作
添加依赖xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--SpringSecurity依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
创建一个Controller去测试
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@ResponseBody
@RequestMapping("/hello")
public String hello(){
return "Hello";
}
}
引入依赖后我们在尝试去访问之前的接口就会自动跳转到一个SpringSecurity的默认login登陆页面,默认用户名是user,密码会输出在控制台。
可以通过继承 WebSecurityConfigurerAdapter 实现修改默认页面
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests() // 开启权限配置
.anyRequest() // 所有请求
.authenticated() // 进行认证
.and()
.formLogin() // 设置表单登录
.loginPage("/login.html")//修改默认的登入页面,可以替换为自己的登入页面
.loginProcessingUrl("/doLogin")//处理请求要和form表单里面的action一致
.defaultSuccessUrl("/index")//登录成功去的地方也可以是请求
// .successForwardUrl("/index")
// .failureForwardUrl()
.failureUrl("/error.html")//登录失败
.usernameParameter("uname")//获取用户名
.passwordParameter("passwd")//获取密码
.permitAll() // 跟登录相关的页面和接口不做拦截,直接通过
.and()
.csrf().disable(); // 禁用CSRF防御功能,Spring Security自带了CSRF防御机制,但是我们这里为了测试方便,先将CSRF防御机制关闭
}
}
可以在static文件下创建login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
<script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>
<style>
#login .container #login-row #login-column #login-box {
border: 1px solid #9C9C9C;
background-color: #EAEAEA;
}
</style>
<body>
<div id="login">
<div class="container">
<div id="login-row" class="row justify-content-center align-items-center">
<div id="login-column" class="col-md-6">
<div id="login-box" class="col-md-12">
<form id="login-form" class="form" action="/doLogin" method="post">
<h3 class="text-center text-info">登录</h3>
<div class="form-group">
<label for="username" class="text-info">用户名:</label><br>
<input type="text" name="uname" id="username" class="form-control">
</div>
<div class="form-group">
<label for="password" class="text-info">密码:</label><br>
<input type="text" name="passwd" id="password" class="form-control">
</div>
<div class="form-group">
<input type="submit" name="submit" class="btn btn-info btn-md" value="登录">
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
然后创建一个HelloController的类,就可以开始测试
@RestController
public class HelloController {
@RequestMapping(index)
public String index(){
// 获取登录用户的用户名
String name = SecurityContextHolder.getContext().getAuthentication().getName();
return "index "+name;
}
}