Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringSecurity入门案例——基本功能讲解

SpringSecurity入门案例——基本功能讲解

作者头像
GeekLiHua
发布于 2025-01-21 08:20:21
发布于 2025-01-21 08:20:21
20500
代码可运行
举报
文章被收录于专栏:JavaJava
运行总次数:0
代码可运行

SpringSecurity入门案例——基本功能讲解

简介:本文讲解,SpringSecurity的快速入门案例,主要讲解基本功能,其他拦截器,与jwt的结合在后面的文章中讲解。

项目代码地址:https://gitee.com/geek-li-hua/code-in-blog.git

项目实现

项目准备
导入依赖

这些是这个项目需要的依赖

  • Spring Boot Starter JDBC
  • Project Lombok
  • MySQL Connector/J
  • mybatis-plus-boot-starter
  • mybatis-plus-generator
  • spring-boot-starter-security
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- Spring Boot Starter JDBC -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!-- Project Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- MySQL Connector/J -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
        </dependency>
        <!-- MyBatis Plus Boot Starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>

        <!-- MyBatis Plus Generator -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.3</version>
        </dependency>

        <!-- Spring Boot Starter Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
  • 完整的pom.xml
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.15</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springsecurity-back-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springsecurity-back-demo</name>
    <description>springsecurity-back-demo</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

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

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

        <!-- Spring Boot Starter JDBC -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!-- Project Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- MySQL Connector/J -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
        </dependency>
        <!-- MyBatis Plus Boot Starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>

        <!-- MyBatis Plus Generator -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.3</version>
        </dependency>

        <!-- Spring Boot Starter Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- JJWT API -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.11.2</version>
        </dependency>

        <!-- JJWT Implementation -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <version>0.11.2</version>
            <scope>runtime</scope>
        </dependency>

        <!-- JJWT Jackson -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
            <version>0.11.2</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
配置文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring.port = 8080
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/db?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
springsecurity登录

当我们启动项目的时候,会出现一个密码,这是因为加入了springsecurity的依赖导致的。

当我们通过一个网页,访问其中一个端口时

会发现需要输入账号和密码,其中账号是user,密码是上面生成的,只有登录之后,我们才可以进行相关的调试。

实现加密
  • 我们需要使用到一个类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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;
import org.springframework.security.crypto.password.PasswordEncoder;


@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public PasswordEncoder passwordEncoder() {

        return new BCryptPasswordEncoder();
    }
}
  • 我们在测试类中演示它的使用

对密码进行加密

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
    void contextLoads() {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        System.out.println(passwordEncoder.encode("123456"));
    }

对于同一字符串,每次加密的结果可能也不一样。

  • 可以通过matchs方法检验,加密之后与之前是否匹配

可以通过结果看出来的是,虽然对于同一密码每次的加密都不一样,但是,都是可以匹配的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
    void contextLoads() {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        System.out.println(passwordEncoder.encode("123456"));
        System.out.println(passwordEncoder.matches("123456", "$2a$10$9dBGJIqaejarMaPSJZfzZumyyT4gjY8etzgp3warVCJw2GR6USbtC")); // true
        System.out.println(passwordEncoder.encode("123456"));
        System.out.println(passwordEncoder.matches("123456", "$2a$10$WPyb8qBc7DfPSD6l6nVnauiexFQ/MTF6nExLZid4Li5RINhBfr4pC")); // true
        System.out.println(passwordEncoder.encode("123456"));
        System.out.println(passwordEncoder.matches("123456", "$2a$10$U0M5Xap/aKo7ZBLiZEvfluZH8FQT10yD2PwInhyU/7W2bSXNoBcba")); // true
        System.out.println(passwordEncoder.matches("1", "$2a$10$U0M5Xap/aKo7ZBLiZEvfluZH8FQT10yD2PwInhyU/7W2bSXNoBcba")); // false
    }
让SpringSecurity的登录账号和密码与自己的数据中的用户的信息匹配
  • 实现一个UserDetailsServiceImpl
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 根据用户名查询用户信息
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", username);
        User user = userMapper.selectOne(queryWrapper);
        // 判断用户是否存在
        if (user == null) {
            throw new UsernameNotFoundException("用户名不存在");
        }
        return new UserDetailsImpl(user);
    }
}
  • 再实现一个UserDetailsImpl类,实现UserDetails里面的方法,并且重写,按照我下面的这样
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDetailsImpl implements UserDetails {
    private User user;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        // 返回拥有的权限
        return null;
    }

    @Override
    public String getPassword() {
        // 返回密码
        return user.getPassword();
    }

    @Override
    public String getUsername() {
        // 返回用户名
        return user.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {
        // 返回账户是否未过期
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        // 返回账户是否未锁定
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        // 返回凭据是否未过期
        return true;
    }

    @Override
    public boolean isEnabled() {
        // 返回账户是否可用
        return true;
    }
}
  • 当我们上面都配置正确之后,我们再次运行的时候,就不会生成一个随机密码了
  • 配置完上面的之后,我们就可以用数据库里面的账号,进行登录了。 如果数据库里面存的是没有加密的数据,可以加上{noop},这样就可以不用存密文。

两个用户使用123456都可以登录,第二个用户存储的是123456加密之后的密文

  • 实现下面的方法,特别是addUser的方法,对用户进行添加,以后注册就是这个原理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    IUserService userService;

    /**
     * 查询所有用户
     */
    @GetMapping("/all/")
    public List<User> getAll() {
        return userService.list();
    }

    /**
     * 查询单个用户
     */
    @GetMapping("/{userId}/")
    public User getUser(@PathVariable int userId) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id",userId);

        return userService.getOne(queryWrapper);
    }

    /**
     * 添加某个用户 直接输入 id name password
     * @param userId
     * @param username
     * @param password
     * @return Add User Sucessfully
     */
    @GetMapping("/add/{userId}/{username}/{password}/")
    public String addUser(
            @PathVariable int userId,
            @PathVariable String username,
            @PathVariable String password) {
        PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String encodedPassword = passwordEncoder.encode(password);
        User user = new User(userId, username, encodedPassword);
        userService.save(user);
        return "Add User Successfully";
    }


    /**
     * 删除某个用户,直接输入 id
     * @param userId
     * @return Delete User Successfully
     */
    @GetMapping("/delete/{userId}/")
    public String deleteUser(@PathVariable int userId) {
        userService.removeById(userId);
        return "Delete User Successfully";
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringSecurity结合JwtToken验证(后端部分)
简介:本文在SpringSecurity基础公共之上,整合JwtToken功能,本文是后端部分。
GeekLiHua
2025/01/21
1600
SpringSecurity结合JwtToken验证(后端部分)
SpringSecurity
​ Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。
roydonGuo
2022/12/05
6200
SpringSecurity
【SpringSecurity系列01】初识SpringSecurity
​ 用自己的话 简单介绍一下,Spring Security基于 Servlet 过滤器链的形式,为我们的web项目提供认证与授权服务。它来自于Spring,那么它与SpringBoot整合开发有着天然的优势,目前与SpringSecurity对应的开源框架还有shiro。接下来我将通过一个简单的例子带大家来认识SpringSecurity,然后通过分析它的源码带大家来认识一下SpringSecurity是如何工作,从一个简单例子入门,大家由浅入深的了解学习SpringSecurity。
yukong
2019/04/18
8010
【SpringSecurity系列01】初识SpringSecurity
SpringBoot集成SpringSecurity - 入门(一)
源码地址:https://github.com/springsecuritydemo/microservice-auth-center01
用户1212940
2022/04/13
1.1K0
SpringBoot集成SpringSecurity - 入门(一)
SpringSecurity 入门(一)
感觉现在的Java开发人员已经离不开Spring框架,不讨论这种事情是好是坏,但是确实好用,但是个人入门有些东西难度还是很高的,摸索的进度有些许的慢,只能慢慢的更新了,那今天就慢慢更新一期SpringSecurity的入门篇,完成完整的系统,可以直接投入生产开发使用。
是小张啊喂
2021/08/09
5850
SpringSecurity入坑(一)
整体使用内存做授权验证, 后续整理基于JDBC 做权限授权,整体一套下来的话,基本上对于springsecurity有一个基本的了解,入坑第一步建议以基础入手,大部分的配置建议查看官方源码 ,对于登出以及记住密码,细节在 源码HttpSecurity类中有详细说明,这里不做过多的说明。只提供基础的Demo示例
是小张啊喂
2021/04/06
4050
单点登录SSO解决方案之SpringSecurity+JWT实现
  通过前面几天文章我们详细的介绍了SpringSecurity的使用,本文我们来看下,结合JWT来实现单点登录操作。
用户4919348
2019/12/11
1.7K0
单点登录SSO解决方案之SpringSecurity+JWT实现
【Spring Security】003-Spring Security web权限方案(1):用户认证
在resources目录下创建static目录,并创建login.html,name必须是username和password;
訾博ZiBo
2025/01/06
1220
【Spring Security】003-Spring Security web权限方案(1):用户认证
SpringSecurity之记住我功能的实现
登录的时候,请求发送给过滤器UsernamePasswordAuthenticationFilter,当该过滤器认证成功后,会调用RememberMeService,会生成一个token,将token写入到浏览器cookie,同时RememberMeService里边还有个TokenRepository,将token和用户信息写入到数据库中。这样当用户再次访问系统,访问某一个接口时,会经过一个RememberMeAuthenticationFilter的过滤器,他会读取cookie中的token,交给RememberService,RememberService会用TokenRepository根据token从数据库中查是否有记录,如果有记录会把用户名取出来,再调用UserDetailService根据用户名获取用户信息,然后放在SecurityContext里。
Dream城堡
2018/09/10
9630
SpringSecurity之记住我功能的实现
Spring 全家桶之 Spring Security(二)
&emsp;&emsp;授权的主要作用是给登录系统的用户的角色授予该角色角色所能访问的菜单列表或者能操作的功能
RiemannHypothesis
2022/08/19
4390
Spring 全家桶之 Spring Security(二)
springboot 整合 springSecurity 和shiro
SpringSecurity 安全简介 1、在 Web 开发中,安全一直是非常重要的一个方面。安全虽然属于应用的非功能性需求,但是应该在应用开发的初期就考虑进来。如果在应用开发的后期才考虑安全的问题,就可能陷入一个两难的境地:一方面,应用存在严重的安全漏洞,无法满足用户的要求,并可能造成用户的隐私数据被攻击者窃取;另一方面,应用的基本架构已经确定,要修复安全漏洞,可能需要对系统的架构做出比较重大的调整,因而需要更多的开发时间,影响应用的发布进程。因此,从应用开发的第一天就应该把安全相关的因素考虑进来,并在整个应用的开发过程中。
kirin
2021/04/30
1.2K0
Spring-Security & JWT 实现 token
因为使用的是mybatis plus,所以没有使用mapper.xml书写sql语句,直接调用提供的CRUD。
BUG弄潮儿
2022/12/05
1K0
Spring-Security & JWT 实现 token
SpringSecurity简单入门(基于SpringBoot)
在 config 包中定义 配置类 在配置类上加上 @EnableWebSecurity注解来开启安全配置 继承 WebSecurityConfigurerAdapter 重写 configure(HttpSecurity http)方法 为了快速入门使用的是内存中创建了用户和角色
用户9006224
2022/12/21
2300
Spring 全家桶之 Spring Security(一)
&emsp;&emsp;Spring Security是基于Spring的安全框架,Spring Security提供全面的安全性解决方案,同时在Web Request和Method处理身份认证和授权,在Spring Framework基础上,Spring Security充分利用了Soring的 DI和AOP特性,为应用系统提供了声明式的安全访问控制功能,是一个轻量级的框架,可以很好的与Spring及Spring MVC集成
RiemannHypothesis
2022/08/19
5740
Spring 全家桶之 Spring Security(一)
Spring Security 基于数据库的认证
[wp_editor_md_c80226e17602863cd62006de14c028b6.jpg]
mySoul
2020/06/19
5190
Spring 全家桶之 Spring Security(三)
自定义类SysUser类代替Spring Security中的UserDetails类,实现UserDetails中的方法, 放在entity包中,同时新增实体类SysRole
RiemannHypothesis
2022/08/19
5730
Spring 全家桶之 Spring Security(三)
SpringBoot集成Spring Security(1)——入门程序
因为项目需要,第一次接触 Spring Security,早就听闻 Spring Security 功能强大但上手困难,学习了几天出入门道,特整理这篇文章希望能让后来者少踩一点坑(本文附带实例程序,请放心食用)
全栈程序员站长
2022/09/09
8520
SpringBoot集成Spring Security(1)——入门程序
Spring Security
springBoot 2.5.5 + Mybatis + Spring Security 5.x
P轴
2022/11/18
8340
Spring boot with Oauth2
本文节选自《Netkiller Java 手札》 作者:netkiller 网站:http://www.netkiller.cn 5.20. Spring boot with Oauth2 下面例子由
netkiller old
2018/03/05
1.8K0
SpringBoot整合SpringSecurity简单实现登入登出从零搭建
技术栈 : SpringBoot + SpringSecurity + jpa + freemark ,完整项目地址 : https://github.com/EalenXie/spring-security-login
EalenXie
2020/09/21
5.3K0
SpringBoot整合SpringSecurity简单实现登入登出从零搭建
相关推荐
SpringSecurity结合JwtToken验证(后端部分)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档