持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
1 概述
在 Java 生态中,目前有 Spring Security 和 Apache Shiro 两个安全框架,可以完成认证和授权的功能。
2 快速入门
实现访问 API 接口时,需要首先进行登录,才能进行访问。
- (1)引入依赖
<!-- 实现对 Spring MVC 的自动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 实现对 Spring Security 的自动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- (2)
Application启动类
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
-
(3)
yml配置文件-
在
spring.security配置项,设置 Spring Security 的配置,对应SecurityProperties配置类。 -
默认情况下,Spring Boot
UserDetailsServiceAutoConfiguration自动化配置类,会创建一个内存级别的InMemoryUserDetailsManagerBean 对象,提供认证的用户信息。- 添加了
spring.security.user配置项,UserDetailsServiceAutoConfiguration 会基于配置的信息创建一个用户User在内存中。 - 否则,会自动创建一个用户名为
"user",密码为 UUID 随机的用户User在内存中。
- 添加了
-
spring:
# Spring Security 配置项,对应 SecurityProperties 配置类
security:
# 配置默认的 InMemoryUserDetailsManager 的用户账号与密码。
user:
name: user # 账号
password: user # 密码
roles: ADMIN # 拥有角色
-
(4)
AdminController控制器- 用于测试未登录时,会被拦截到登录界面。
@RestController
@RequestMapping("/admin")
public class AdminController {
@GetMapping("/demo")
public String demo() {
return "示例返回";
}
}
-
(5)测试
- 执行
Application#main(String[] args)方法,运行项目。 - 项目启动成功后,浏览器访问 http://127.0.0.1:8080/admin/demo 接口。因为未登录,所以被 Spring Security 拦截到登录界面。
- 因为我们没有自定义登录界面,所以默认会使用 DefaultLoginPageGeneratingFilter 类,生成上述界面。
- 输入我们配置的「user/user」账号,进行登录。登录完成后,因为 Spring Security 会记录被拦截的访问地址,所以浏览器自动动跳转 http://127.0.0.1:8080/admin/demo 接口。
- 执行
3 进阶使用
自定义 Spring Security 的配置,实现权限控制。