SpringSecurity介绍

Spring Security 是针对 Spring 项目的安全框架,也是 Spring Boot 底层安全模块默认的技术选型。它可以实现强大的 Web 安全控制。对于安全控制吧,我们仅如引入 Security 场景启动器,进行少量配置,即可实现强大的安全管理。

应用程序安全的主要两个区域就是“认证”和“授权”:

  • 认证(Authentication):建立一个声明主体的过程,主体一般是指用户。
  • 授权(Authorization):指确定一个主体是否允许在你的应用程序执行一个动作的过程。

SpringSecurity with Boot 快速开始 | SpringSecurity 官方文档

整合SpringSecurity

  • WebSecurityConfigurerAdapter:自定义 Security 策略。
  • AuthenticationManagerBuilder:自定义认证策略。
  • @EnableWebSecurity:开启 WebSecurity 模式。

1、使用 maven 新建 SpringBoot 项目,引入 Web、Thymeleaf、Security 场景启动器,依赖如下:

<?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 http://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>1.5.19.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>zze.spring</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>
        <!--修改 thymeleaf 依赖版本为 3 -->
        <thymeleaf.version>3.0.11.RELEASE</thymeleaf.version>
        <thymeleaf-layout-dialect.version>2.4.1</thymeleaf-layout-dialect.version>
        <thymeleaf-extras-springsecurity4.version>3.0.2.RELEASE</thymeleaf-extras-springsecurity4.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-thymeleaf</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>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--thymeleaf 模板中使用 springsecurity 标签-->
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity4</artifactId>
        </dependency>
    </dependencies>

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

</project>

pom.xml

2、编写测试模板页:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<div sec:authorize="!isAuthenticated()">
    <a th:href="@{/login}">请登录</a>
</div>
<div sec:authorize="isAuthenticated()">
    <span sec:authentication="name"/> 您好,您拥有角色:<span sec:authentication="principal.authorities"/>
    <form th:action="@{/logout}" method="post">
        <input type="submit" value="注销">
    </form>
</div>
<div sec:authorize="hasRole('VIP1')"><a th:href="@{/level/1}">LEVEL 1</a></div>
<div sec:authorize="hasRole('VIP2')"><a th:href="@{/level/2}">LEVEL 2</a></div>
<div sec:authorize="hasRole('VIP3')"><a th:href="@{/level/3}">LEVEL 3</a></div>
</body>
</html>

templates/welcome.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>登录页</title>
</head>
<body>
<form th:action="@{/login}" method="post" >
    用户名:<input type="text" name="username"> <br>
    密码:<input type="text" name="password"> <br>
    <input type="checkbox" name="rememberMe">
    <input type="submit" value="登录"/>
</form>

</body>
</html>

templates/login.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>级别</title>
</head>
<body>
<a th:href="@{/}">首页</a>

<h1 th:text="${level}"></h1>
</body>
</html>

templates/pages/level.html

3、编写测试 Controller:

package zze.spring.security.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@Controller
public class TestController {
    private final String PREFIX = "pages/";

    // 欢迎页
    @GetMapping("/")
    public String index() {
        return "welcome";
    }

    @GetMapping("/level/{level}")
    public String level(@PathVariable Integer level, Model model) {
        model.addAttribute("level", level == 1 ? "初级" : level == 2 ? "中级" : "高级");
        return PREFIX + "level";
    }

    @GetMapping("/login")
    public String login(){
        return "login";
    }
}

zze.spring.security.controller.TestController

4、配置:

package zze.spring.security.config;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * 编写配置类继承 WebSecurityConfigurerAdapter
 */
@EnableWebSecurity // 启用 WebSecurity 模式
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 控制请求的访问权限
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
//        super.configure(http);
        // 定制请求的授权规则
        http.authorizeRequests().antMatchers("/").permitAll() // "/" 允许任何人访问
                .antMatchers("/level/1").hasRole("VIP1") // "/level/1" 仅允许拥有角色 VIP1 的主体访问
                .antMatchers("/level/2").hasRole("VIP2") // "/level/2" 仅允许拥有角色 VIP2 的主体访问
                .antMatchers("/level/3").hasRole("VIP3"); // "/level/3" 仅允许拥有角色 VIP3 的主体访问

        // 开启自动配置的登录功能,开启后未登录状态访问将会自动重定向到 /login 登录页
        //   1、访问 /login 来到登录页
        //   2、重定向到 /login?error 表示登录失败
        //   3、可通过 loginPage() 方法修改使用自己的登录页,登录请求需要为 post,的用户名参数默认为 username ,密码参数为 password 。
        //   4、如果使用了 loginPage() 方法修改了登录页,那么该请求的 post 方式就是登录请求。比如修改 /userLogin 为登录页,那么 post 请求 /userLogin 则是登录操作
        http.formLogin().usernameParameter("username").passwordParameter("password").loginPage("/login");

        // 开启自动配置的注销
        //   1、访问 /logout 表示用户注销,情况 session
        //   2、注销成功默认会重定向到 /login?logout
        //
        //  通过 logoutSuccessUrl("/") 方法指定注销成功重定向的页面
        http.logout().logoutSuccessUrl("/");

        // 开启记住我功能
        //   1、登录成功后,将 cookie 发送给浏览器保存,以后访问都会带上这个 cookie,通过检查就可以免登录
        //   2、点击注销会删除 cookie
        //   3、可通过 rememberMeParameter 方法定义登录操作的记住我参数名
        http.rememberMe().rememberMeParameter("rememberMe");
    }

    // 定义认证规则
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        super.configure(auth);
        auth.inMemoryAuthentication().withUser("zhangsan").password("123456").roles("VIP1", "VIP2") // 内存中存入一个用户(主体),用户名为 zhangsan 密码为 123456,拥有角色 VIP1 和 VIP2
                .and()
                .withUser("lisi").password("123456").roles("VIP2", "VIP3") // 内存中存入一个用户(主体),用户名为 lisi 密码为 123456,拥有角色 VIP2 和 VIP3
                .and()
                .withUser("wangwu").password("123456").roles("VIP1", "VIP3"); // 内存中存入一个用户(主体),用户名为 wangwu 密码为 123456,拥有角色 VIP1 和 VIP3
    }
}

zze.spring.security.config.SecurityConfig

java框架之SpringBoot(15)-安全及整合SpringSecurity的更多相关文章

  1. java框架之SpringBoot(16)-分布式及整合Dubbo

    前言 分布式应用 在分布式系统中,国内常用 Zookeeper + Dubbo 组合,而 SpringBoot 推荐使用 Spring 提供的分布式一站式解决方案 Spring + SpringBoo ...

  2. java框架之SpringBoot(12)-消息及整合RabbitMQ

    前言 概述 大多数应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦的能力. 消息服务中两个重要概念:消息代理(message broker)和目的地(destination).当消息发送者发送 ...

  3. java框架之SpringBoot(13)-检索及整合Elasticsearch

    ElasticSearch介绍 简介 我们的应用经常需要使用检索功能,开源的 Elasticsearch 是目前全文搜索引擎的首选.它可以快速的存储.搜索和分析海量数据.SpringBoot 通过整合 ...

  4. (七) SpringBoot起飞之路-整合SpringSecurity(Mybatis、JDBC、内存)

    兴趣的朋友可以去了解一下前五篇,你的赞就是对我最大的支持,感谢大家! (一) SpringBoot起飞之路-HelloWorld (二) SpringBoot起飞之路-入门原理分析 (三) Sprin ...

  5. 【SpringBoot】Springboot2.x整合SpringSecurity

    一.Spring Security是什么?有什么作用(核心作用)?以及如何阅读本篇文章 1.是什么 Spring Security是Spring家族的一个强大的安全框架,与Springboot整合的比 ...

  6. java框架之SpringBoot(9)-数据访问及整合MyBatis

    简介 对于数据访问层,无论是 SQL 还是 NOSQL,SpringBoot 默认采用整合 SpringData 的方式进行统一处理,添加了大量的自动配置,引入了各种 Template.Reposit ...

  7. 【java框架】SpringBoot(5)--SpringBoot整合分布式Dubbo+Zookeeper

    1.理论概述 1.1.分布式 分布式系统是若干独立计算机的集合,这些计算机对于用户来讲就像单个系统. 由多个系统集成成一个整体,提供多个功能,组合成一个板块,用户在使用上看起来是一个服务.(比如淘宝网 ...

  8. java框架之SpringBoot(11)-缓存抽象及整合Redis

    Spring缓存抽象 介绍 Spring 从 3.1 版本开始定义了 org.springframework.cache.Cache 和 org.springframework.cache.Cache ...

  9. 【java框架】SpringBoot(7) -- SpringBoot整合MyBatis

    1.整合MyBatis操作 前面一篇提到了SpringBoot整合基础的数据源JDBC.Druid操作,实际项目中更常用的还是MyBatis框架,而SpringBoot整合MyBatis进行CRUD也 ...

随机推荐

  1. Python中的string模块的学习

    代码为主,相信有python基础的都能看懂: ? [python] view plain copy >>> import string   >>> string.a ...

  2. Visual Studio 2015 msvsmon.exe crashed when c++ debugging with x64

    Completely uninstalling Astrill fixed the issue but this solution is not what I want. Astrill suppor ...

  3. VS2015 怎么安装RDLC报表模板?

    这几天刚好用到微软自带的RDLC报表,但是在VS2015张找了一圈也没找,难道是我VS版本 不支持,在网上查了下,有的人说VS2015社区版,企业版不支持,只有专业版支持,各说不一,想想不科学呀,微软 ...

  4. Goland常用快捷键

    文件相关快捷键: CTRL+E,打开最近浏览过的文件. CTRL+SHIFT+E,打开最近更改的文件. CTRL+N,可以快速打开struct结构体. CTRL+SHIFT+N,可以快速打开文件. 代 ...

  5. 项目中phpexcel的基本用法

    前提:要下载PHPEXCEL库文件 如:phpexcel官方下载    ,本人使用下载 情形一:对于将数据写入EXCEL表中的用法 header("content-type:text/htm ...

  6. IDEA2018.2破解方法

    前言 之前也试过多种方式,但是总是使用了一会儿又需要破解,今天又找了一个,不知道可以使用多久. 目前看是可以破解开的,所以分享一下. 适用于JetBrain旗下版本为2.3或2.4的所有产品 一.在 ...

  7. eclipse的debug模式下启动不了tomcat

    使用eclipse启动tomcat,正常模式下可以启动tomcat,却在debug模式下无法启动tomcat. 这个问题可能是由于eclipse和tomcat的交互而产生的,在以debug模式启动to ...

  8. python中导入一个需要传参的模块

    最近跑实验,遇到了一个问题:由于实验数据集比较多,每次跑完一个数据集就需要手动更改文件路径,再将文件传到服务器,再运行实验,这样的话效率很低,必须要专门看着这个实验,啥时候跑完就手动修改运行下一个实验 ...

  9. MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report e

    早上来到公司,线上的项目报错: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionExcepti ...

  10. JS的eval函数解密反混淆

    https://www.hhtjim.com/js-decryption-de-obfuscate-eval-function.html JS的eval函数解密反混淆