本文是本人对Helloworld Spring Security 中java config方式的翻译,由于本人英语水平太差,想通过翻译技术文档的方式来学习英语和技术,同时也可以为以后方便自己查看。
文档的原地址为:http://docs.spring.io/spring-security/site/docs/current/guides/html5//helloworld-javaconfig.html
Hello Spring Security Java Config
作者: Version 版本:4.1.1.RELEASE
这个文档介绍的是已不依靠xml配置的方式在已有项目中添加Spring Security的操作指南。
- 本文包括以下内容:
- 启动示例
- 获取一个示例项目。
- 导入这个不安全的示例项目。
- 运行这个不安全的应用。
- 给这个应用添加安全框架。
- 更新这个项目的依赖。
- 创建你的spring Security 配置
- 以War宝方式发布项目
- 运行这个安全项目
- 启动示例
-
- 这个部分的主要内容是如何通过这个步骤以STS(IDE工具)开始工作。下一部分主要是讲为你已存在的项目添加安全框架的通用步骤。你可以通过简单 的几部修改你的已存在的项目,我们建议你按照我们的指导步骤做,以减少复杂性。
获取这个示例项目
导入这个不安全的项目
我们建议你导入这个不安全的项目,你可以使用任何的IDE,但是这个说明文档是以默认你使用的是STS
这个 项目你可以在SPRING_SECURITY_HOME/Samples/Javaconfig/Helloworld目录下找到。
~ 如果你并没有安装STS,可以通过这个地址下载Https://Spring.Io/Tools
打开STS并导入这个示例项目,步骤如下:
-
-
文件→导入
-
Existing Maven Projects
-
点击下一步 >
-
点击浏览…
-
导航到项目 (i.e. SPRING_SECURITY_HOME/samples/xml/insecure) and click OK
-
点击完成
-
运行这个不安全的示例程序
下面的几步练习中,我们将要修改这个项目。在我们做任何修改前,我们首先要确认这个项目是可以正常运行的。通过一下几个步骤来确定这个项目是可以工作的。
-
右键点击这个项目
-
选择Run As→Run on Server
-
选择最新的这个项目
-
点击完成
通过一下这个页面来验证这个项目的正常运行 http://localhost:8080/sample/
当你确定这个项目可以正常运行的时候就可以通过一下方法将它关闭了:
-
在我们选择的这个项目窗口下
-
点击停止按钮 (一个红色的方框) 来停止这个项目
为项目条件安全框架
在你为你的项目添加安全框架之前你一定要确定他现在在不安全的时候是可以运行的,就像我们上一步的验证方法一样。现在我们的项目运行在没有安全的防护下,我们将要为我们的项目添加安全框架。这部分的演示将通过最少的步骤为我们的项目添加安全框架。
更新你的依赖
Spring Security GA 版本 是包含在Maven库中的,所以我们只需要添加Maven库就可以了.
为了可以使用Spring Security 我们必须添加必要的依赖。下面给出了Spring Security依赖。
<dependencies>
<!-- ... other dependency elements ... -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.1.1.RELEASE</version>
</dependency>
</dependencies>
当你完成这些之后,你要通过以下方式确保你的STS更新了依赖:
-
右击你这个项目
-
选择Maven→更新项目…
-
选中项目, 点击OK
创建你的 Spring Security 配置
下面的几步是去你的一个Spring Security 配置.
-
在包视图下右键点击你的项目
-
选择新建→Class
-
包名填写为 org.springframework.security.samples.config
-
名字为 SecurityConfig
-
点击完成
-
将下面的内容添加到文件中:
package org.springframework.security.samples.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.*;
@EnableWebSecurity
public class SecurityConfig {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
}
The name of the configureGlobal method is not important. However, it is important to only configure AuthenticationManagerBuilder in a class annotated with either @EnableWebSecurity ,@EnableGlobalMethodSecurity , or @EnableGlobalAuthentication . Doing otherwise has unpredictable results. |
配置文件的功能是:
-
为每一个访问你的项目的URL进行认证。
-
为你创建一个登陆页面
-
允许用户以User作为用户名,以Password作为密码 基于表单的认证进行认证
-
允许用户登出
-
防止CSRF 攻击
-
安全头一体化
-
X-Content-Type-Options integration
-
Cache Control (can be overridden later by your application to allow caching of your static resources)
-
X-XSS-Protection integration
-
X-Frame-Options integration to help prevent Clickjacking
-
通过以下Servlet API 方法整合
以War 包方式 注册 Spring 安全框架
我吗已经创建了Spring安全配置,但是我们还需要以war包的方式注册他,他可以通过以下步骤注册 :
-
导航到包资源管理器视图
-
在我们的项目中右键点击包org.springframework.security.samples.config package
-
选择新建→Class
-
输入名称 SecurityWebApplicationInitializer
-
点击完成
-
文件中填入如下内容:
package org.springframework.security.samples.config;
import org.springframework.security.web.context.*;
public class SecurityWebApplicationInitializer
extends AbstractSecurityWebApplicationInitializer {
public SecurityWebApplicationInitializer() {
super(SecurityConfig.class);
}
}
这个SecurityWebApplicationInitializer
将要做如下事情:
-
自动为你程序的每一个URL注册springSecurityFilterChain过滤器
-
添加一个加载SecurityConfig 的监听器
Since we were not already using Spring, this is a simple way to add our SecurityConfig. If we were already using Spring, then we should add our SecurityConfig with the reset of our Spring configuration (i.e. a subclass of AbstractContextLoaderInitializer or AbstractDispatcherServletInitializer) and use the default constructor instead. |
探索安全应用
就像我们在运行我们的不安全的项目时一样,现在我们通过这个网站验证我们的项目http://localhost:8080/sample/ ,你将要被提示登录一个安全框架自动生成的登录页面
认证的安全应用程序
尝试输入无效的用户名和密码:
-
用户名 无效
-
密码 无效
认证失败后你将会看到一个失败页面。现在输入一个正确的用户名和密码:
-
用户名 user
-
密码 password
现在你应该看到了这个安全的页面
我们可以用这个用户名和密码可以正确的验证的原因是因为我们在配置文件中配置了 |
展示用户名
现在我们已经认证通过了, 让我们更新一下项目来显示用户名。更新一下index.jsp页面:
<body>
<div class="container">
<h1>This is secured!</h1>
<p>
Hello <b><c:out value="${pageContext.request.remoteUser}"/></b>
</p>
</div>
</body>
The <c:out /> tag ensures the username is escaped to avoid XSS vulnerabilities Regardless of how an application renders user inputed values, it should ensure that the values are properly escaped. |
刷新一下这个页面http://localhost:8080/sample/ 我们将会看到展现出了我们的名字。这是因为安全框架集成了Servlet API 方法。
登出
现在我们已经可以看到我们的名字了,让我们更新一下程序让他可以登出。更新index.jsp页面 添加一下的代码:
<body>
<div class="container">
<h1>This is secured!</h1>
<p>
Hello <b><c:out value="${pageContext.request.remoteUser}"/></b>
</p>
<c:url var="logoutUrl" value="/logout"/>
<form class="form-inline" action="${logoutUrl}" method="post">
<input type="submit" value="Log out" />
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>
</div>
</body>
默认情况想为了一帮助我们防止 CSRF 攻击, Spring 安全框架配置文件登出需要:
-
HTTP 方法是Post请求
-
CSRF token 必须添加到request中. You can access it on the ServletRequest using the attribute _csrf as illustrated above.
If you were using Spring MVC’s tag library or Thymeleaf, the CSRF token is automatically added as a hidden input for you. |
Refresh the page at http://localhost:8080/sample/ and you will see the log out button. Click the logout button and see that the application logs you out successfully.