SpringSecurity入门&整合Jwt

1.SpringSecurity入门

1.1 SpringSecurity介绍

Spring 是非常流行和成功的 Java 应用开发框架,Spring Security正是Spring家族中的成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。

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

权限框架对比

SpringSecurity特点:

和Spring无缝整合。

全面的权限控制。

专门为Web开发而设计。

旧版本不能脱离Web环境使用。

新版本对整个框架进行了分层抽取,分成了核心模块和Web模块。单独引入核心模块就可以脱离 Web环境。

重量级。

Shiro

Apache旗下的轻量级权限控制框架。

特点:

轻量级。Shiro主张的理念是把复杂的事情变简单。针对对性能有更高要求的互联网应用有更好表现。

通用性。

好处:不局限于Web环境,可以脱离Web环境使用。

缺陷:在Web环境下一些特定的需求需要手动编写代码定制。

Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展了多年了,但是使用的并不多,安全管理这个领域,一直是 Shiro 的天下。

相对于 Shiro,在 SSM 中整合 Spring Security 都是比较麻烦的操作,当然shiro也很麻烦,Spring Security 更麻烦。所以,Spring Security 虽然功能比 Shiro 强大,但是使用反而没有 Shiro 多(Shiro 虽然功能没有 Spring Security 多,但是对于大部分项目而言,Shiro 也够用了)。

springboot出现之前

自从有了 Spring Boot 之后,Spring Boot 对于 Spring Security 提供了自动化配置方案,可以使用更少的配置来使用 Spring Security。

SpringCloud

因此,一般来说,常见的安全管理技术栈的组合是这样的:

SSM + Shiro

SpringBoot+shiro

SSM+Spring Security

SpringBoot+Spring Security

1.微服务权限控制 redis自己封装 结合网关

2.SpringCloud Security

SpringCloud + SpringCloud Security oauth2.0

SpringCloudAlibaba +SpringCloud Security

Spring Boot/Spring Cloud + Spring Security

1.2 SpringSecurity快速体验

1.2.1 新建工程

<?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.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.gxa</groupId>
    <artifactId>permission</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>permission</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-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>5.1.32</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

1.2.2 添加配置类

/**
 * Created by zxd on 2021/11/20 17:07
 */
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    //配置认证方式
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.formLogin()//表单认证
        .and().authorizeRequests()//认证配置
        .anyRequest()//任何请求
        .authenticated();//都需要身份认证


    }
}

1.2.3 编写测试接口

/**
 * Created by zxd on 2021/11/20 17:10
 */
@RestController
public class HelloController {


    @GetMapping("/hello")
    public String hello(){
        System.out.println("hello测试...");
        return "hello world!";
    }


}

1.2.4 启动项目

SpringSecurity会内置一个账户

默认的用户名:user

密码在项目启动的时候在控制台会打印,注意每次启动的时候密码都回发生变化!

1.2.5 访问项目

输入localhost:8080/hello 会自动跳转到一个内置的登录页面

输入用户名user和控制台启动时获取的密码登录后可以继续访问目标资源

1.3 认证模式

1.3.1 HttpBasic模式

什么是Basic认证

在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务 器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名及密码,然后将用户名及密码以BASE64加密,加密后的密文将附加于请求信息中, 如当用户名为mayikt,密码为:123456时,客户端将用户名和密码用“:”合并,并将合并后的字符串用BASE64加密为密文,并于每次请求数据 时,将密文附加于请求头(Request Header)中。HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64加密的用户名和密码),解开请求包,对用户名及密码进行验证,如果用 户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。

/**
 * Created by zxd on 2023/2/7 10:50
 */
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {


    //代码中配置账号信息
    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        //设置用户账号信息和权限
        auth.inMemoryAuthentication().
                withUser("admin").password("123456")
                .authorities("pay");
    }


   //配置认证方式
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.httpBasic()//httpBasic认证
                .and().authorizeRequests()//认证配置
        .anyRequest()//任何请求
        .authenticated();//都需要身份认证

    }

    @Bean
    public static NoOpPasswordEncoder passwordEncoder() {
        return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
    }

}

1.3.2 FromLogin

/**
 * Created by zxd on 2023/2/7 10:50
 */
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {


    //代码中配置账号信息
    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        //设置用户账号信息和权限
        auth.inMemoryAuthentication().
                withUser("admin").password("123456")
                .authorities("pay");
    }


   //配置认证方式
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.formLogin()//表单认证
                .and().authorizeRequests()//认证配置
        .anyRequest()//任何请求
        .authenticated();//都需要身份认证

    }

    @Bean
    public static NoOpPasswordEncoder passwordEncoder() {
        return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
    }

}

1.4 权限管理概念

1.4.1 主体

英文单词:principal

使用系统的用户或设备或从其他系统远程登录的用户等等。简单说就是谁使用系统谁就是主体。

1.4.2 认证

英文单词:authentication

权限管理系统确认一个主体的身份,允许主体进入系统。简单说就是“主体”证明自己是谁。

笼统的认为就是以前所做的登录操作。

1.4.3 授权

英文单词:authorization

将操作系统的“权力”“授予”“主体”,这样主体就具备了操作系统中特定功能的能力。

所以简单来说,授权就是给用户分配权限。

1.5 SpringSecurity过滤器链

1.4.1 过滤器链

SpringSecurity 本质是一个过滤器链:

从启动是可以获取到过滤器链:

org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter

org.springframework.security.web.context.SecurityContextPersistenceFilter

org.springframework.security.web.header.HeaderWriterFilter

org.springframework.security.web.csrf.CsrfFilter

org.springframework.security.web.authentication.logout.LogoutFilter

org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter

org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter

org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter

org.springframework.security.web.savedrequest.RequestCacheAwareFilter

org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter

org.springframework.security.web.authentication.AnonymousAuthenticationFilter

org.springframework.security.web.session.SessionManagementFilter

org.springframework.security.web.access.ExceptionTranslationFilter

org.springframework.security.web.access.intercept.FilterSecurityInterceptor

代码底层流程:重点看三个过滤器:

FilterSecurityInterceptor:是一个方法级的权限过滤器, 基本位于过滤链的最底部。

ExceptionTranslationFilter:是个异常过滤器,用来处理在认证授权过程中抛出的异常。

UsernamePasswordAuthenticationFilter :对ogin的POST请求做拦截,校验表单中用户名,密码。

1.4.2 FilterSecurityInterceptor

   public void invoke(FilterInvocation fi) throws IOException, ServletException {
        if (fi.getRequest() != null && fi.getRequest().getAttribute("__spring_security_filterSecurityInterceptor_filterApplied") != null && this.observeOncePerRequest) {
            fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
        } else {
            if (fi.getRequest() != null && this.observeOncePerRequest) {
                fi.getRequest
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冲向梦想的天空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值