SpringSecurity入门

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: SpringSecurity入门


为什么要有SpringSecurity?

正如你可能知道的关于安全方面的两个主要区域是“认证”和“授权”(或者访问控制),一般来说,Web应用的安全性包括用户认证
(Authentication)和用户授权(Authorization)两个部分,这两点也是Spring Security重要核心功能。

用户认证:系统判断用户是否可以登录

用户授权:系统判断用户是否有权限做某些十强

SpringSecurity入门案例

第一步:创建SpringBoot工程

第二步:导入依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

第三步:创建编写控制层

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

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



SpringSecurity基本原理

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

SpringSecurity两个重要接口

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

SpringSecurity-web权限方案

认证

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



第二种:通过配置类

@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);
    }
}

整合数据库

第一步:引入相关依赖

<!--mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>
<!--mysql-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

第二步:创建数据库的表


第三步:创建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
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
安全 算法 Java
SpringSecurity 快速入门
SpringSecurity 快速入门
19 3
|
8月前
|
安全 Java 数据库
SpringSecurity 入门
Spring Security是Spring采用 `AOP`思想,基于 `servlet过滤器`实现的安全框架。它提供了完善的**认证机制**和**方法级的授权功能**。是一款非常优秀的权限管理框架。
56 0
|
2月前
|
存储 安全 Java
SpringSecurity 从入门到精通
SpringSecurity 从入门到精通
|
3月前
|
SQL 安全 Java
【SpringSecurity】简介
【SpringSecurity】简介
24 0
|
5月前
|
安全 Java 数据库
SpringBoot - 安全入门与SpringSecurity
SpringBoot - 安全入门与SpringSecurity
38 0
|
10月前
|
存储 SQL 前端开发
SpringSecurity-从入门到精通(2)
2.3.3.2 密码加密存储 ​ 实际项目中我们不会把密码明文存储在数据库中。 ​ 默认使用的PasswordEncoder要求数据库中的密码格式为:{id}password 。它会根据id去判断密码的加密方式。但是我们一般不会采用这种方式。 ​ 所以就需要替换 PasswordEncoder。
|
10月前
|
存储 安全 NoSQL
SpringSecurity-从入门到精通(1)
0. 简介 ​ Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 ​ 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多,因为相比与SpringSecurity,Shiro的上手更加的简单。
|
8月前
SpringSecurity框架
SpringSecurity框架
16 0
|
8月前
|
安全 Java 数据库
SpringBoot整合SpringSecurity(通俗易懂)
SpringBoot整合SpringSecurity(通俗易懂)
51 0
|
9月前
|
安全 Java 数据库
SpringBoot整合SpringSecurity(通俗易懂) 1
SpringBoot整合SpringSecurity(通俗易懂)
112 0