一 . 介绍SpringSecurity
SpringSecurity是一个功能强大且高度可定制的身份验证和访问控制框架,它是保护基于Spring的应用程序的实际标准。
Spring Security是⼀个⾯向Java应⽤程序提供身份验证和安全性的框架。
与所有Spring项⽬⼀样,Spring Security的真正威⼒在于它可以轻松地扩展以满⾜定制需求。
应用程序安全性可以归结为差不多两个独立的问题:身份验证(你是谁?)
和授权(你可以做什么?)
在Spring Security
架构设计中,认证和授权 是分开的,⽆论使⽤什么样的认证⽅式
二. 权限管理
基本上涉及到⽤户参与的系统都要进⾏权限管理,权限管理属于系统安全的范畴,权限管理实现对⽤户访问系统的控制,按照安全规则或者安全策略控制⽤户可以访问⽽且只能访问⾃⼰被授权的资源。权限管理包括⽤户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源⽤户⾸先经过身份认证,认证通过后⽤户具有该资源的访问权限⽅可访问。
也就是通过身份认证检查是否有进入系统的权利,通过授权检查是否有访问特定资源的权利。
1、认证
身份认证,就是判断⼀个⽤户是否为合法⽤户的处理过程。最常⽤的简单身份认证⽅式是系统通过核对⽤户输⼊的⽤户名和⼝令,看其是否与系统中存储的该⽤户的⽤户名和⼝令⼀致,来判断⽤户身份是否正确。
2、授权
授权,即访问控制,控制谁能访问哪些资源。主体进⾏身份认证后需要分配权限⽅可访问系统的资源,对于某些资源没有权限是⽆法访问的
三. 编写
1.加jar包
<!-- 加jar 就代表项目加上了安全框架 没有加这个jar就代表项目没有使用安全框架 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
2.编写application.yml
spring:
security:
user:
name: dys
password: dys
3.创建启动类
4.创建html页面
5.创建配置类(新类 写一次可长久使用)
里面写 SpringSecurity 逻辑 注释在代码内
package com.aaa.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
// 配置类
@Configuration // spring框架中的注解 当前的类是一个配置类
@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 配置用户的信息
* @param auth
* @throws Exception
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 不能使用明文密码
// 配置使用的密码是什么
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();// 密码解析器
String pwd = passwordEncoder.encode("dys");// 加密之后的密码
// 解析密码吗的时候 需要看你使用的加密规则 是什么 加密和解密务必使用同一套规则
System.out.println("pwd = " + pwd);
// 在内存中配置认证的信息
auth.inMemoryAuthentication()
.passwordEncoder(passwordEncoder)// 加密解密的规则
.withUser("dys").password(pwd).roles("admin");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.loginPage("/login.html").permitAll()// 登录的页面是login.html
.loginProcessingUrl("/mylogin").permitAll();
http.authorizeRequests().anyRequest().authenticated();// 除了放行之外的其他的路径全部需要认证
// 由于我们设置的 登录是一个html页面
http.csrf().disable();
}
@Override
public void configure(WebSecurity web) throws Exception {
super.configure(web);
}
}
6.创建Controller层
controller返回调用了前几次写好的Result工具类
package com.aaa.controller;
import com.aaa.util.Result;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("aaa")
public class MySecurityController {
@GetMapping
public Result index(){
return Result.success("index");
}
}