【SpringSecurity】授权认证基本使用

一、Spring Security介绍

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

记住几个类:

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

WebSecurityConfigurerAdapter :比较关键的实现类,不过现已过时
有其他方案可以替代它,但是我还没有找到好的资料来阐述是怎么替代的

二、认证,授权

第一个被称为“认证”,是为用户建立一个他所声明的主体。主体一般是指用户,设备或可以在系统中执行动作的其他系统。

一般为验证身份,用户使用账号密码登录

第二个叫“授权”,指的是一个用户能否在应用中执行某个操作,在到达授权判断之前,身份的主体已经由身份验证过程建立。

登录之后,在应用中的权限,只能进行自己权限范围的操作

三、实际操作

  1. 引入jar包
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-securityartifactId>
dependency>

引入此jar包后,无论访问何路径默认都要先进行登录

  1. 编写配置类
package com.aaa.config;

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.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * @author : 尚腾飞([email protected])
 * @version : 1.0
 * @createTime : 2022/10/27 18:04
 * @description :
 */
@EnableWebSecurity
public class SecutityConfig 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")
                //登录相关
                .and()
                .formLogin()
                //指定登录页面
                .loginPage("/toLogin")
                //登录逻辑的处理过程默认为login
                .loginProcessingUrl("/login")
                //表单中的用户名的input框中的name属性默认为username,通过下面可以修改
                .usernameParameter("user")
                //表单中的密码的input框中的name属性默认为username,通过下面可以修改
                .passwordParameter("pwd")
                //注销登录相关
                .and()
                .logout()
                //注销成功后跳转的路径,默认是跳回登录页面,这里改回首页
                .logoutSuccessUrl("/")
                //记住我功能
                .and()
                //rememberMeParameter:修改参数为remember
                .rememberMe().rememberMeParameter("remember");
        //禁用csrf
        http.csrf().disable();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .passwordEncoder(new BCryptPasswordEncoder())
                //添加用户
                .withUser("admin").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1", "vip2", "vip3")
                .and()
                .withUser("normal").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2", "vip3")
                .and()
                .withUser("guest").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1");
    }
}
  1. 编写controller
package com.aaa.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author : 尚腾飞([email protected])
 * @version : 1.0
 * @createTime : 2022/10/27 11:50
 * @description :
 */
@Controller
public class RouterController {

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

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

    @RequestMapping("/level1/{id}")
    public String level1(@PathVariable("id") int id) {
        return "views/level1/" + id;
    }

    @RequestMapping("/level2/{id}")
    public String level2(@PathVariable("id") int id) {
        return "views/level2/" + id;
    }

    @RequestMapping("/level3/{id}")
    public String level3(@PathVariable("id") int id) {
        return "views/level3/" + id;
    }
}

目录结构
【SpringSecurity】授权认证基本使用_第1张图片

页面显示:【SpringSecurity】授权认证基本使用_第2张图片

你可能感兴趣的:(spring,boot,spring,java,spring,boot)