SpringSecurity入门

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 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
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
安全 Java 数据库
SpringSecurity 入门
Spring Security是Spring采用 `AOP`思想,基于 `servlet过滤器`实现的安全框架。它提供了完善的**认证机制**和**方法级的授权功能**。是一款非常优秀的权限管理框架。
265 0
|
安全 Java 数据库
SpringSecurity基础入门详解
SpringSecurity基础入门详解
351 0
|
安全 算法 Java
SpringSecurity 快速入门
SpringSecurity 快速入门
305 3
|
Java 数据安全/隐私保护 Spring
SpringSecurity6从入门到实战之SpringSecurity整合自动装配详解(源码级别讲解,耐心)
该内容是关于SpringSecurity在SpringBoot中的自动配置详解。文章首先提出问题:SpringSecurity如何在引入依赖后使所有请求需认证并显示登录表单。接着,它探讨了SpringBoot的自动装配原理,从@SpringBootApplication注解开始,深入到@EnableAutoConfiguration的实现,解释了如何通过扫描jar包中的.imports文件来加载自动配置类。特别提到了SpringBootWebSecurityConfiguration类,该类默认设置为对所有请求进行认证,并支持表单和Basic认证。
|
4月前
|
安全 前端开发 Java
Spring Security
Spring Security 是Java应用安全的基石,提供认证、授权等全方位防护。支持表单、OAuth2、JWT等多种认证方式,基于过滤器链实现精细控制,适配单体、前后端分离及微服务架构,是构建企业级安全体系的首选框架。
|
7月前
|
安全 Java 测试技术
说一说 Spring Security 中的单元测试
我是小假 期待与你的下一次相遇 ~
132 1
|
10月前
|
安全 数据安全/隐私保护
SpringSecurity核心功能
SpringSecurity核心功能
|
安全 Java 数据库
实现基于Spring Security的权限管理系统
实现基于Spring Security的权限管理系统
|
12月前
|
监控 网络安全 开发者
Python中的Paramiko与FTP文件夹及文件检测技巧
通过使用 Paramiko 和 FTP 库,开发者可以方便地检测远程服务器上的文件和文件夹是否存在。Paramiko 提供了通过 SSH 协议进行远程文件管理的能力,而 `ftplib` 则提供了通过 FTP 协议进行文件传输和管理的功能。通过理解和应用这些工具,您可以更加高效地管理和监控远程服务器上的文件系统。
442 20
|
缓存 应用服务中间件 nginx
dockerfile构建镜像详细解释与应用
Dockerfile 是一种可被 Docker 程序解释的脚本,用于定义如何构建容器镜像。它通过一系列指令指定镜像的配置和定制需求,支持自动化构建,简化开发、测试和部署流程。
439 0