一, 什么是 Spring Security?
Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架, 它是用于保护基于 Spring 的应用程序的实际标准.
Spring Security 是一个框架, 致力于为 Java 应用程序提供身份验证和授权. 与所有 Spring 项目一样, Spring Security 的真正强大之处在于可以轻松扩展以满足自定义要求.
更多信息可以查看官网: https://spring.io/projects/spring-security
二, Spring Security 的主要功能
认证: 验证用户名和密码是否合法 (是否系统中用户)
授权: 是系统用户不代表你能使用某些功能, 因为你可能没有权限
防御会话固定, 点击劫持, 跨站点请求伪造等攻击
Servlet API 集成
与 Spring web MVC 的可选集成
三, 快速入门
新建一个 SpringBoot 的 Web 项目 spring-boot-security.
案例 1: 接口不添加保护
pom 文件中不引入 Spring Security, 然后新建一个 controller:
- @RestController
- public class AppController {
- @GetMapping("/hello")
- public String hello() {
- return "Hello,spring security!";
- }
- }
然后打开浏览器访问: http://localhost:8080/hello, 成功后返回:
Hello,spring security!
案例 2: 接口添加保护
pom 文件添加依赖
pom 文件中引入 Spring Security 的 starter:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-security</artifactId>
- </dependency>
访问接口
打开浏览器再次访问 http://localhost:8080/hello, 会被重定向到登录页 http://localhost:8080/login, 截图如下:
要登录系统, 我们需要知道用户名和密码, Spring Security 默认的用户名是 user, 项目启动的时候会生成默认密码 (在启动日志中可以看到), 输入用户名和密码后就可以访问 / hello 接口了.
当然也可以自定义用户名密码, 在配置文件添加如下内容即可:
- spring.security.user.name=java_suisui
- spring.security.user.password=123456
四, 自定义认证和授权
上面说过 Spring Security 的功能有 "认证" 和 "授权", 下面通过一个简单的例子实现下自定义的认证和授权.
假设系统中有两个角色:
ADMIN 可以访问 / admin 下的资源
USER 可以访问 / user 下的资源
按照下面步骤操作即可.
新建一个配置类
对于用户名, 密码, 登录页面, 访问权限等都可以在 WebSecurityConfigurerAdapter 的实现类中配置.
WebSecurityConfig 代码如下:
- /**
- * 配置类
- * @Author java_suisui
- *
- */
- @EnableWebSecurity
- @Configuration
- public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
- @Override
- protected void configure(AuthenticationManagerBuilder auth) throws Exception {
- // 配置内存中的 用户名, 密码和角色
- auth.inMemoryAuthentication().passwordEncoder(new MyPasswordEncoder()).withUser("user").password("123456").roles("USER");
- auth.inMemoryAuthentication().passwordEncoder(new MyPasswordEncoder()).withUser("admin").password("123456").roles("ADMIN");
- }
- @Override
- protected void configure(HttpSecurity http) throws Exception {
- http.authorizeRequests()
- .antMatchers("/login").permitAll()
- .antMatchers("/user").hasRole("USER") // 访问 /user 这个接口, 需要有 USER 角色
- .antMatchers("/admin").hasRole("ADMIN")
- .anyRequest().authenticated() // 剩余的其他接口, 登录之后就能访问
- .and()
- .formLogin().defaultSuccessUrl("/hello");
- }
- }
创建 PasswordEncorder 的实现类
内存用户验证时, Spring Boot 2.0 以上版本引用的 security 依赖是 spring security 5.X 版本, 此版本需要提供一个 PasswordEncorder 的实例.
MyPasswordEncoder 代码如下:
- public class MyPasswordEncoder implements PasswordEncoder {
- @Override
- public String encode(CharSequence rawPassword) {
- return rawPassword.toString();
- }
- @Override
- public boolean matches(CharSequence rawPassword, String encodedPassword) {
- return encodedPassword.equals(rawPassword);
- }
- }
登录验证
浏览器打开 http://localhost:8080/login,
使用 user 登录, 可以访问 / user
使用 admin 登录, 可以访问 / admin
如果使用 user 登录后访问 / admin, 会报 403 错误, 具体错误信息如下:
- Whitelabel Error Page
- This application has no explicit mapping for /error, so you are seeing this as a fallback.
- Tue Nov 19 16:26:28 CST 2019
- There was an unexpected error (type=Forbidden, status=403).
- Forbidden
结果和我们预期的一致, 说明简单的自定义认证和授权功能已经实现了.
完整源码地址: https://github.com/suisui2019/springboot-study
来源: https://www.cnblogs.com/haha12/p/11895678.html