Spring Security十分钟入门教程

 更新时间:2022年09月08日 14:48:53   作者:夜猫nightcat  
这篇文章主要介绍了Spring Security入门教程,Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架

写在前面

我们在学习技术的过程中,学习的渠道大概有以下几种:看书,视频,博客。我们会发现,一种技术开始流行的时候,各种形式的讲述也就出现了。那么,出书,录视频,写博客的人,在他们之前,是没有什么现成的东西让他们学习的,他们是怎么上手的呢?换句话说,怎么才能有效的快速的上手一门技术呢?

这篇文章,我们一起从零开始学习SpringSecurity,技术点不重要,重要的是学习方式。

说来惭愧,在写这个专栏之前,我并没有学习过SpringSecurity。这也是我的一次新的尝试。

目标

这篇文章的目标是实现简单的登录,退出功能。展示从一无所知,到使用这个技术处理简单需求的全过程。

开始

我们知道,Spring的社区支持特别完善,Spring全家桶的文档特别好,那么我们话不多说,打开Spring Security 官网看一下。

看完这个图片我们明白了,得创建一个SpringBoot工程,构建工具我们选择常用的maven,然后引入SpringSecurity的starter即可,当然为了测试引入SpringSecurity之后访问接口的变化,我们要引入web的starter,就像是SpringBoot入门时候一样

不引入Spring Security访问接口

创建SpringBoot工程,这个太简单了,不过多赘述

<?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.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.nightcat</groupId>
    <artifactId>security</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>security</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <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>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
package com.nightcat.security.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello Security";
    }
}

把项目启动起来,之后输入localhost:8080/hello,就会看到浏览器显示helloSecurity。

引入Spring Security访问接口

其实所有的安全管理框架,需要解决的就是两件事,认证和鉴权,认证是判断用户是不是当前系统的用户,不是就不让他用系统,鉴权简单理解就是,有权限访问系统的哪些部分,比如有些功能你要登录之后才能用,有些功能是内部人员可用,即根据角色分配权限,根据权限分配可用范围。

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

加入SpringSecurity依赖。

这个时候,如果再访问 hello接口,就会出现一个页面,让咱们登录。

可是到目前为止,我们根本不知道用户名和密码,更不知道这个页面从哪来的,我们目前的项目里,没有自己写任何页面。没办法,继续看文档。

我们的工程是Servlet工程,看看文档是怎么写的。

在快速上手章节有一个Spring Boot Auto Configuration,文档写的非常明白,主要做了三件事

①创建了一个SpringSecurityFilterChain

②创建了一个UserDetailsService,用户名是user ,一个随机的密码是在控制台打印出来了。

③把 SpringSecurityFilterChain,注册到Web容器里,每个请求都经过它

好了,看到第二条,我们就能登录了。

文档中提到了,每次随机生成一个密码供用户登录使用,我们先来看看那个密码长什么样子:

Using generated security password: caab29d4-b177-4fa7-85e2-f23a1f6246cf

这个密码显然不是我们想要的,总不能每次启动项目,都生成一个新的密码,而且用户名也不可能都叫做user,我们希望能自己定制用户名和密码。我们现在并不知道该怎么做。继续读文档。

我们来看看SpringSecurity给我们提供的例子:Spring Security 例子

我们看到了,SpringSecurity提供的例子,有199次提交,我们找到最开始的几次提交记录。看看它都做了什么。

找到了

那我们照葫芦画瓢,把中间的用户名和密码改一下,然后登录。

package com.nightcat.security.config;
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.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("zhangsan")
                .password("123")
                .roles("USER")
                .build();
        return new InMemoryUserDetailsManager(user);
    }
}

好了,剩下的东西我们先本着不求甚解,一步步来的原则,先看看zhangsan/123能不能登录。

我这里直接给结论吧,不再截图,是可以登录的,并且每次都是这个用户名和密码。

退出登录

我们实现了登录,退出登录怎么做呀?我们不知道引入SpringSecurity之后怎么做,还是看它的例子,我们发现它并没有编写退出登录的接口,我们以前的常规操作就是,点击按钮然后把当前登录人从Session中remove掉就行了。那SpringSecurity是怎么做的呢?继续看它的例子。

我们虽然没有找到它处理退出逻辑的自定义接口,但是我们发现它的页面中url是/logout,那么我们直接尝试一下从浏览器输入这个url

哎呦,还真的可以,点击logout就退出了。

后记

刚开始学,我们不用对自己要求太高,应该掌握一种思路,如何上手新技术,完成最最简单的功能再一步步迭代。这里留了很多坑,比如角色权限的配置,比如集成数据库,比如用户策略这些,比如我们要在退出的时候实现一些逻辑再退出,其实我自己也不会,都需要一步步去学习,我们应该掌握方法,消除对陌生技术的恐惧感。

到此这篇关于Spring Security十分钟入门教程的文章就介绍到这了,更多相关Spring Security内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java运用SWT插件编写桌面记事本应用程序

    Java运用SWT插件编写桌面记事本应用程序

    这篇文章主要为大家介绍了一个Java项目实战,一步步教你实现记事本,步骤很详细,运用SWT插件手把手编写记事本,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • Java模糊查询方法详解

    Java模糊查询方法详解

    这篇文章主要为大家详细介绍了Java模糊查询方法的实现,实例教你如何用Java做模糊查询结果,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • Jeecg-Boot异常处理'jeecg-boot.QRTZ_LOCKS' doesn't exist问题

    Jeecg-Boot异常处理'jeecg-boot.QRTZ_LOCKS' doesn'

    这篇文章主要介绍了Jeecg-Boot异常处理'jeecg-boot.QRTZ_LOCKS' doesn't exist问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Jmeter测试必知的名词及环境搭建

    Jmeter测试必知的名词及环境搭建

    我们本章开始学习Jmeter,后续还会有RF以及LoadRunner 的介绍,为什么要学习Jmeter,它主要是用来做性能测试的,其中它也需要间接或直接的需要用到抓包工具
    2021-09-09
  • Java数据库连接池之proxool_动力节点Java学院整理

    Java数据库连接池之proxool_动力节点Java学院整理

    Proxool是一种Java数据库连接池技术。方便易用,便于发现连接泄漏的情况
    2017-08-08
  • java 使用Graphics2D在图片上写字

    java 使用Graphics2D在图片上写字

    这篇文章主要介绍了java 使用Graphics2D在图片上写字,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 基于Springboot+Junit+Mockito做单元测试的示例

    基于Springboot+Junit+Mockito做单元测试的示例

    本篇文章主要介绍了基于Springboot+Junit+Mockito做单元测试的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • 手把手教你如何利用SpringBoot实现审核功能

    手把手教你如何利用SpringBoot实现审核功能

    审核功能经过几个小时的奋战终于完成了,现在我就与广大网友分享我的成果,这篇文章主要给大家介绍了关于如何利用SpringBoot实现审核功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Java Guava的使用技巧整理

    Java Guava的使用技巧整理

    Guava是Google发布的一个开源库,主要提供了一些在Java开发中非常有用的工具类和API,不管是工作还是学习都是非常值得我们去熟悉的,一起来看看吧
    2023-03-03
  • 利用线程实现动态显示系统时间

    利用线程实现动态显示系统时间

    编写Applet小程序,通过在HTML文档中接收参数,显示当前的系统时间,需要的朋友可以参考下
    2015-10-10

最新评论