MVC 4 中的 Spring Security 使用 Spring Boot

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

好吧,经过相当长的时间,将近一年,我已经准备好在这里发布我的下一篇文章。这是一篇逾期已久且要求很高的帖子。我将撰写有关如何使用 Spring Security 保护 Spring MVC 4 Web 应用程序的文章。我将使用 Spring Boot 构建一个快速且无需配置的应用程序。我 在这里 详细介绍了如何在 Spring Data Rest 应用程序中使用 Spring Boot。

Spring Boot 可以与 Maven 或 Gradle 等构建工具一起使用。这些构建工具可帮助您在各种应用程序之间共享 jar、构建您的应用程序并生成报告。我将使用 spring security 入门指南 中提供的相同应用程序,但使用 JSP 进行视图。

下载

使用 Spring Boot 设置项目

1. 在 Eclipse 中转到新建 -> Maven 项目,


2.点击Next -> Check Create a simple project -> Give workspace location


3.点击Next ->In Archetype selection,选择maven-archetype-webapp


然后在下一个屏幕中提供有关该项目的一些细节,

当我们在本教程结束时完成项目实施时,项目结构将如下所示,

4. 让我们创建一个非常简单的 spring mvc 应用程序并使用 spring security 对其进行保护。重写您的 pom.xml 文件以匹配下面给出的内容。


 <?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>
    <groupId>org.programmingfree</groupId>
    <artifactId>pf-securing-web</artifactId>
    <version>0.1.0</version>
 <packaging>war</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.5.RELEASE</version>
    </parent>
&lt;dependencies&gt;
    &lt;dependency&gt;
  &lt;groupId&gt;org.apache.tomcat.embed&lt;/groupId&gt;
  &lt;artifactId&gt;tomcat-embed-jasper&lt;/artifactId&gt;
  &lt;scope&gt;provided&lt;/scope&gt;

</dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <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> </dependencies>

&lt;properties&gt;
    &lt;java.version&gt;1.8&lt;/java.version&gt;
&lt;/properties&gt;

&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;

&lt;repositories&gt;
    &lt;repository&gt;
        &lt;id&gt;spring-releases&lt;/id&gt;
        &lt;name&gt;Spring Releases&lt;/name&gt;
        &lt;url&gt;https://repo.spring.io/libs-release&lt;/url&gt;
    &lt;/repository&gt;
&lt;/repositories&gt;
&lt;pluginRepositories&gt;
    &lt;pluginRepository&gt;
        &lt;id&gt;spring-releases&lt;/id&gt;
        &lt;name&gt;Spring Releases&lt;/name&gt;
        &lt;url&gt;https://repo.spring.io/libs-release&lt;/url&gt;
    &lt;/pluginRepository&gt;
&lt;/pluginRepositories&gt;

</project>


-- 如果您在上面的 pom.xml 中注意到我们正在添加下面给出的两个依赖项,因为我们使用 JSP 来处理视图。

<依赖关系>

<groupId>org.apache.tomcat.embed</groupId>

<artifactId>tomcat-embed-jasper</artifactId>

<范围>提供</范围>

</依赖>

<依赖关系>

<groupId>javax.servlet</groupId>

<artifactId>jstl</artifactId>

</依赖>


-- 虽然我们用“战争”来包装,但我们仍然可以执行它。这是由“spring-boot-maven-plugin”处理的。

-- 我们将“spring-boot-starter-security”作为依赖项之一,这将为我们引导与安全相关的所有内容。

5.在WEB-INF\jsp里面一一创建视图。

src\main\webapp\WEB-INF\jsp\home.jsp


 <?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>
    <groupId>org.programmingfree</groupId>
    <artifactId>pf-securing-web</artifactId>
    <version>0.1.0</version>
 <packaging>war</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.5.RELEASE</version>
    </parent>
&lt;dependencies&gt;
    &lt;dependency&gt;
  &lt;groupId&gt;org.apache.tomcat.embed&lt;/groupId&gt;
  &lt;artifactId&gt;tomcat-embed-jasper&lt;/artifactId&gt;
  &lt;scope&gt;provided&lt;/scope&gt;

</dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <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> </dependencies>

&lt;properties&gt;
    &lt;java.version&gt;1.8&lt;/java.version&gt;
&lt;/properties&gt;

&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;

&lt;repositories&gt;
    &lt;repository&gt;
        &lt;id&gt;spring-releases&lt;/id&gt;
        &lt;name&gt;Spring Releases&lt;/name&gt;
        &lt;url&gt;https://repo.spring.io/libs-release&lt;/url&gt;
    &lt;/repository&gt;
&lt;/repositories&gt;
&lt;pluginRepositories&gt;
    &lt;pluginRepository&gt;
        &lt;id&gt;spring-releases&lt;/id&gt;
        &lt;name&gt;Spring Releases&lt;/name&gt;
        &lt;url&gt;https://repo.spring.io/libs-release&lt;/url&gt;
    &lt;/pluginRepository&gt;
&lt;/pluginRepositories&gt;

</project>

这是一个简单的欢迎页面,不会受到保护。此页面有一个指向问候页面 (hello.jsp) 的链接,只有在经过身份验证后才能访问该页面。

src\main\webapp\WEB-INF\jsp\hello.jsp



 <?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>
    <groupId>org.programmingfree</groupId>
    <artifactId>pf-securing-web</artifactId>
    <version>0.1.0</version>
 <packaging>war</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.5.RELEASE</version>
    </parent>
&lt;dependencies&gt;
    &lt;dependency&gt;
  &lt;groupId&gt;org.apache.tomcat.embed&lt;/groupId&gt;
  &lt;artifactId&gt;tomcat-embed-jasper&lt;/artifactId&gt;
  &lt;scope&gt;provided&lt;/scope&gt;

</dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <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> </dependencies>

&lt;properties&gt;
    &lt;java.version&gt;1.8&lt;/java.version&gt;
&lt;/properties&gt;

&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;

&lt;repositories&gt;
    &lt;repository&gt;
        &lt;id&gt;spring-releases&lt;/id&gt;
        &lt;name&gt;Spring Releases&lt;/name&gt;
        &lt;url&gt;https://repo.spring.io/libs-release&lt;/url&gt;
    &lt;/repository&gt;
&lt;/repositories&gt;
&lt;pluginRepositories&gt;
    &lt;pluginRepository&gt;
        &lt;id&gt;spring-releases&lt;/id&gt;
        &lt;name&gt;Spring Releases&lt;/name&gt;
        &lt;url&gt;https://repo.spring.io/libs-release&lt;/url&gt;
    &lt;/pluginRepository&gt;
&lt;/pluginRepositories&gt;

</project>

此页面显示带有登录用户名称的问候消息,并且只能由经过身份验证的用户访问。

src\main\webapp\WEB-INF\jsp\login.jsp


 <?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>
    <groupId>org.programmingfree</groupId>
    <artifactId>pf-securing-web</artifactId>
    <version>0.1.0</version>
 <packaging>war</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.5.RELEASE</version>
    </parent>
&lt;dependencies&gt;
    &lt;dependency&gt;
  &lt;groupId&gt;org.apache.tomcat.embed&lt;/groupId&gt;
  &lt;artifactId&gt;tomcat-embed-jasper&lt;/artifactId&gt;
  &lt;scope&gt;provided&lt;/scope&gt;

</dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <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> </dependencies>

&lt;properties&gt;
    &lt;java.version&gt;1.8&lt;/java.version&gt;
&lt;/properties&gt;

&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;

&lt;repositories&gt;
    &lt;repository&gt;
        &lt;id&gt;spring-releases&lt;/id&gt;
        &lt;name&gt;Spring Releases&lt;/name&gt;
        &lt;url&gt;https://repo.spring.io/libs-release&lt;/url&gt;
    &lt;/repository&gt;
&lt;/repositories&gt;
&lt;pluginRepositories&gt;
    &lt;pluginRepository&gt;
        &lt;id&gt;spring-releases&lt;/id&gt;
        &lt;name&gt;Spring Releases&lt;/name&gt;
        &lt;url&gt;https://repo.spring.io/libs-release&lt;/url&gt;
    &lt;/pluginRepository&gt;
&lt;/pluginRepositories&gt;

</project>


顾名思义,此页面包含用户提交凭据的登录表单。

6. 使用下面给出的代码在名为“hello”的包内创建三个 java 类。

src\main\java\hello\MvcConfig.java


 <?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>
    <groupId>org.programmingfree</groupId>
    <artifactId>pf-securing-web</artifactId>
    <version>0.1.0</version>
 <packaging>war</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.5.RELEASE</version>
    </parent>
&lt;dependencies&gt;
    &lt;dependency&gt;
  &lt;groupId&gt;org.apache.tomcat.embed&lt;/groupId&gt;
  &lt;artifactId&gt;tomcat-embed-jasper&lt;/artifactId&gt;
  &lt;scope&gt;provided&lt;/scope&gt;

</dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <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> </dependencies>

&lt;properties&gt;
    &lt;java.version&gt;1.8&lt;/java.version&gt;
&lt;/properties&gt;

&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;

&lt;repositories&gt;
    &lt;repository&gt;
        &lt;id&gt;spring-releases&lt;/id&gt;
        &lt;name&gt;Spring Releases&lt;/name&gt;
        &lt;url&gt;https://repo.spring.io/libs-release&lt;/url&gt;
    &lt;/repository&gt;
&lt;/repositories&gt;
&lt;pluginRepositories&gt;
    &lt;pluginRepository&gt;
        &lt;id&gt;spring-releases&lt;/id&gt;
        &lt;name&gt;Spring Releases&lt;/name&gt;
        &lt;url&gt;https://repo.spring.io/libs-release&lt;/url&gt;
    &lt;/pluginRepository&gt;
&lt;/pluginRepositories&gt;

</project>

src\main\java\hello\WebSecurityConfig.java


 <?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>
    <groupId>org.programmingfree</groupId>
    <artifactId>pf-securing-web</artifactId>
    <version>0.1.0</version>
 <packaging>war</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.5.RELEASE</version>
    </parent>
&lt;dependencies&gt;
    &lt;dependency&gt;
  &lt;groupId&gt;org.apache.tomcat.embed&lt;/groupId&gt;
  &lt;artifactId&gt;tomcat-embed-jasper&lt;/artifactId&gt;
  &lt;scope&gt;provided&lt;/scope&gt;

</dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <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> </dependencies>

&lt;properties&gt;
    &lt;java.version&gt;1.8&lt;/java.version&gt;
&lt;/properties&gt;

&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;

&lt;repositories&gt;
    &lt;repository&gt;
        &lt;id&gt;spring-releases&lt;/id&gt;
        &lt;name&gt;Spring Releases&lt;/name&gt;
        &lt;url&gt;https://repo.spring.io/libs-release&lt;/url&gt;
    &lt;/repository&gt;
&lt;/repositories&gt;
&lt;pluginRepositories&gt;
    &lt;pluginRepository&gt;
        &lt;id&gt;spring-releases&lt;/id&gt;
        &lt;name&gt;Spring Releases&lt;/name&gt;
        &lt;url&gt;https://repo.spring.io/libs-release&lt;/url&gt;
    &lt;/pluginRepository&gt;
&lt;/pluginRepositories&gt;

</project>

src\main\java\hello\Application.java



 <?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>
    <groupId>org.programmingfree</groupId>
    <artifactId>pf-securing-web</artifactId>
    <version>0.1.0</version>
 <packaging>war</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.5.RELEASE</version>
    </parent>
&lt;dependencies&gt;
    &lt;dependency&gt;
  &lt;groupId&gt;org.apache.tomcat.embed&lt;/groupId&gt;
  &lt;artifactId&gt;tomcat-embed-jasper&lt;/artifactId&gt;
  &lt;scope&gt;provided&lt;/scope&gt;

</dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <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> </dependencies>

&lt;properties&gt;
    &lt;java.version&gt;1.8&lt;/java.version&gt;
&lt;/properties&gt;

&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;

&lt;repositories&gt;
    &lt;repository&gt;
        &lt;id&gt;spring-releases&lt;/id&gt;
        &lt;name&gt;Spring Releases&lt;/name&gt;
        &lt;url&gt;https://repo.spring.io/libs-release&lt;/url&gt;
    &lt;/repository&gt;
&lt;/repositories&gt;
&lt;pluginRepositories&gt;
    &lt;pluginRepository&gt;
        &lt;id&gt;spring-releases&lt;/id&gt;
        &lt;name&gt;Spring Releases&lt;/name&gt;
        &lt;url&gt;https://repo.spring.io/libs-release&lt;/url&gt;
    &lt;/pluginRepository&gt;
&lt;/pluginRepositories&gt;

</project>

就这些!现在运行应用程序,右键单击项目,以 Maven Build 运行,目标是干净安装 spring-boot:run


这将安装具有所有必要依赖项的项目,在目标文件夹中生成 war 文件并启动 spring boot 提供的嵌入式 tomcat 服务器。打开浏览器并点击 http://localhost:8080/ 可以看到主页,
单击问候语链接后,用户将被重定向到登录页面,如下所示,
如您所见,登录页面提供了一个简单的表单,用于捕获用户名和密码并将它们发布到“/login”。按照配置,Spring Security 提供了一个过滤器来拦截该请求并对用户进行身份验证。如果用户身份验证失败,页面将重定向到“/login?error”并且我们的页面会显示相应的错误消息。成功注销后,我们的应用程序会发送到“/login?logout”并且我们的页面会显示相应的成功消息。
用户在注销后被重定向到登录页面,并显示注销消息,
如果凭据错误,用户将被重定向到带有错误消息的登录页面,
要了解如何直接运行下载的项目,请观看此视频,



怎么运行的

首先让我从应用程序设置开始。在整个实现过程中,我们没有编写任何 xml 配置,甚至使用 Spring Boot 消除了 web.xml。让我一步一步地了解 Spring Boot 如何为我们设置应用程序,

1. Maven 将所有必需的库下载到类路径 (WEB-INF\lib) 后,Spring Boot 会查看类路径并对缺少的内容做出合理的假设,然后添加它。

2. Spring Boot 从使用@SpringBootApplication 注释的类启动应用程序,因此在我们的示例中它以“Application.java”开头

@SpringBootApplication 是一个方便的注释,它添加了以下所有内容:

-- @Configuration 将类标记为应用程序上下文的 bean 定义源。

-- @EnableAutoConfiguration 告诉 Spring Boot 开始添加基于类路径设置、其他 bean 和各种属性设置的 bean。

-- 通常您会为 Spring MVC 应用程序添加 @EnableWebMvc,但 Spring Boot 在类路径上看到 spring-webmvc 时会自动添加它。这会将应用程序标记为 Web 应用程序并激活关键行为,例如设置 DispatcherServlet。

-- @ComponentScan 告诉 Spring 在同一个包内查找其他组件、配置和服务。在这种情况下,它会查找“hello”包内的所有类。

3. 扫描“hello”包时,它将通过@Configuration 遍历所有类,并注册所有存在的配置。在我们的示例中,我们使用 @Configuration 注释了 MvcConfig 和 WebSecurityConfig
4. MvcConfig 类使用 url 注册视图,从而将这些 url 映射暴露给相应的视图。

弹簧安全

当类路径中存在 spring-security 时,Spring 会自动使用基本身份验证保护所有 HTTP 端点。要进一步自定义安全设置,例如根据存储在数据库中的详细信息对用户进行身份验证或仅对特定的 http 端点进行身份验证而不是全部等,您应该设置安全配置。在我们的示例中,我们为除主页 (home.jsp) 之外的所有页面提供了一个简单的内存中身份验证,这是在 WebSecurityConfig 类中配置的。

WebSecurityConfig 类使用@EnableWebMvcSecurity 注释,以启用 Spring Security 的 Web 安全支持并提供 Spring MVC 集成。它还扩展了 WebSecurityConfigurerAdapter 并覆盖了它的几个方法来设置网络安全配置的一些细节。 configure(HttpSecurity) 方法定义哪些 URL 路径应该受到保护,哪些不应该受到保护。具体来说,“/”和“/home”路径被配置为不需要任何身份验证。所有其他路径都必须经过身份验证。

当用户成功登录时,他们将被重定向到先前请求的需要身份验证的页面。有一个由 loginPage() 指定的自定义“/login”页面,每个人都可以查看它。至于 configure(AuthenticationManagerBuilder) 方法,它会为单个用户设置内存中的用户存储。该用户的用户名为“user”,密码为“password”,角色为“USER”。

最后,我们需要为用户提供一种显示当前用户名和注销的方式。更新 hello.html 以向当前用户问好并包含“注销”表单,如下所示

CSRF 攻击

您可能已经注意到我在登录页面和用户注销页面中放置了带有名称="${_csrf.parameterName}" 和值="${_csrf.token}" 的隐藏输入类型。这是为了保护应用程序免受 跨站请求伪造 (CSRF) 攻击

Java 配置默认启用 CSRF 保护。您也可以禁用它。如果您使用的是 Spring MVC <form:form> 标记,则会自动包含 CsrfToken。由于我们没有使用 Spring 表单标签,我使用隐藏输入将 csrf 令牌发送到服务器。 本文 提供了对 Spring MVC 中 CSRF 支持的详细且非常清晰的解释。

演示

下载

注意:我在演示项目中添加了一个用于样式化的静态资源,为了简单起见,我在教程中排除了它。我将在另一篇文章中写如何在使用 Spring Security 和 Spring Boot 的同时使用 javascript 或 css 等静态资源。

相关文章