SpringSecurity(安全)-简单学习

安全应该在什么时候考虑? 设计之初

漏洞,隐私泄露
架构一旦确定

spring security 的核心功能主要包括:

认证 (你是谁)
授权 (你能干什么)
攻击防护 (防止伪造身份)

核心就是一组过滤器链,项目启动后将会自动配置。最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式

简介

SpringSecurity 正是 Spring 家族中的成员。SpringSecurity 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。
对于安全控制,springboot仅需引入spring-boot,starter-security模块。

WebSecurityConfigurerAdapter: 自定义Security策略
AuthenticationManagerBuilder: 自定义认证策略
@EnableWebSecurity: 开启模式

使用

导包
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
编写一个SecurityConfig类继承WebSecurityConfigurerAdapter类

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //首页所有人可以访问,功能页只有对应权限的人才可以访问
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");
        //无权限,跳转到登录界面
        http.formLogin();
        //注销功能;
        http.logout();
    }

//    认证
//    密码编码:passwordEncoder
//    spring security 5.0+ 新增了很多加密方法
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        数据应由数据库中去获取
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("huang").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1")
                .and()
                .withUser("yong").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2")
                .and()
                .withUser("gui").password(new BCryptPasswordEncoder().encode("123456")).roles("vip3");
    }
}
编写相关html文件

SpringSecurity(安全)-简单学习

编写RouterConfig类控制页面跳转
@Controller
public class RouterController {

    @RequestMapping("/index.html")
    public String index(){
        return "index";
    }

    @RequestMapping("/login")
    public String tologin(){
        return "login";
    }

    @RequestMapping("/level1/{id}")
    public String level1(@PathVariable("id") int id){
        return "/level1/"+id;
    }
    @RequestMapping("/level2/{id}")
    public String level2(@PathVariable("id") int id){
        return "/level2/"+id;
    }
    @RequestMapping("/level3/{id}")
    public String level3(@PathVariable("id") int id){
        return "/level3/"+id;
    }
}
相关问题
1、无权限时,跳转到登录页面的URL是什么?
    由源码注释可知URL为 "/login"
    ![](https://www.icode9.com/i/l/?n=20&i=blog/2205131/202109/2205131-20210910105903480-236238819.png)
2、注销后的结果?
    使用默认的URL("/logout"),注销后会自动跳转到 "/login" 即登录页面,并使httpsession无效

SpringSecurity(安全)-简单学习
但是使用了 http.logout().logoutSuccessUrl("/"); 后可以重定向到我们给的URL中
SpringSecurity(安全)-简单学习

3、认证?
    自动获取username和password,并与我们给的数据进行匹配认证

SpringSecurity(安全)-简单学习
SpringSecurity(安全)-简单学习

上一篇:SpringMVC笔记


下一篇:什么时候用@PostMapping和@GetMapping和@RequestMapping