SpringSecurity入门

SpringSecurity

  • 为什么要有SpringSecurity?
  • SpringSecurity入门案例
  • SpringSecurity基本原理
    • SpringSecurity两个重要接口
  • SpringSecurity-web权限方案
    • 认证
    • 整合数据库

为什么要有SpringSecurity?

正如你可能知道的关于安全方面的两个主要区域是“认证”和“授权”(或者访问控制),一般来说,Web应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分,这两点也是Spring Security重要核心功能。
用户认证:系统判断用户是否可以登录
用户授权:系统判断用户是否有权限做某些十强

SpringSecurity入门案例

第一步:创建SpringBoot工程
第二步:导入依赖

<dependency>
  <groupId>org.springframework.bootgroupId>
  <artifactId>spring-boot-starter-securityartifactId>
dependency>

第三步:创建编写控制层

@RestController
@RequestMapping("/test")
public class TestController {
    @GetMapping("hello")
    public String hello(){
        return "hello securioty";
    }
}

第四步:启动运行
运行结果:
当我们向往常的操作方式一样发送请求的时候,它就会拦截我们,对我们的身份进行认证
SpringSecurity入门_第1张图片

SpringSecurity基本原理

SpringSecurity本质是一个过滤器链,有很多过滤器

SpringSecurity两个重要接口

1.UserDetailsService接口
当什么也没有配置的时候,账号和密码是由Spring Security定义生成的。而在实际项目中账号和密码都是从数据库中查询出来的。所以我们要通过自定义逻辑控制认证逻辑。
实现步骤:
创建类继承UsernamePasswordAuthenticationFilter,重写三个方法
创建类实现UserDetailService,编写查询数据过程,返回User对象,这个User对象是安全框架提供对象
2.PasswordEncoder接口
数据接口,用于返回User对象里面密码加密

SpringSecurity-web权限方案

认证

1.设置登录的用户名和密码
第一种:通过配置文件

在这里插入图片描述
运行结果:
SpringSecurity入门_第2张图片
第二种:通过配置类

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String password = passwordEncoder.encode("123");
        auth.inMemoryAuthentication().withUser("lucy").password(password).roles("admin");
    }

    @Bean
    PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

第三种:自定义编写实现类
第一步:创建配置类,设置使用哪个userDetailsService实现类

@Configuration
public class SecurityConfigTest extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(password());
    }

    @Bean
    PasswordEncoder password(){
        return new BCryptPasswordEncoder();
    }
}

第二步:编写实现类,返回User对象用户名密码和操作权限

@Service
public class MyUserDetailsService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("role");
        return new User("maryyc",new BCryptPasswordEncoder().encode("123"),auths);
    }
}

整合数据库

第一步:引入相关依赖


<dependency>
    <groupId>com.baomidougroupId>
    <artifactId>mybatis-plus-boot-starterartifactId>
    <version>3.0.5version>
dependency>


<dependency>
    <groupId>mysqlgroupId>
    <artifactId>mysql-connector-javaartifactId>
dependency>


<dependency>
    <groupId>org.projectlombokgroupId>
    <artifactId>lombokartifactId>
dependency>

第二步:创建数据库的表
SpringSecurity入门_第3张图片
第三步:创建users表对应的实体类

@Data
public class Users {
    private Integer id;
    private String username;
    private String password;
}

第四步:整合mp,创建接口,继承mp接口

@Repository
public interface UserMapper extends BaseMapper<Users> {
}

第五步:在MyUserDetailsService调用mapper里面的方法查询数据库进行用户认证

@Service
public class MyUserDetailsService implements UserDetailsService {

    @Autowired
    private UserMapper userMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        QueryWrapper<Users> wrapper = new QueryWrapper<>();
        wrapper.eq("username",username);
        Users users = userMapper.selectOne(wrapper);


        if(users==null){
            throw  new UsernameNotFoundException("用户名不存在");
        }

        List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("role");
        return new User(username,new BCryptPasswordEncoder().encode(users.getPassword()),auths);
    }
}

第六步:配置数据库

spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/user_db?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8
username: root
password: 2022

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