使用 Spring Security 实现基本认证 已翻译 100%

oschina 投递于 2013/06/04 07:20 (共 4 段, 翻译完成于 06-04)
阅读 4946
收藏 3
0
加载中

1. 概述

本教程展示了如何用spring创建、配置和自定义Basic Authentication. 我们将把我们的教程构建在简单的 Spring MVC example例子之上, 然后使用Spring Security提供的Basic Auth机制来保护该MVC应用的UI。

2. Spring Security 配置

Spring Security的配置仍采用 XML:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:beans="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="
        http://www.springframework.org/schema/security 
        http://www.springframework.org/schema/security/spring-security-3.1.xsd
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

    <http use-expressions="true">
        <intercept-url pattern="/**" access="isAuthenticated()" />

        <http-basic />
    </http>

    <authentication-manager>
        <authentication-provider>
            <user-service>
                <user name="user1" password="user1Pass" authorities="ROLE_USER" />
            </user-service>
        </authentication-provider>
    </authentication-manager>

</beans:beans>

这是Spring中仍需要XML来进行配置的最后几个情形之一 – Java Configuration for Spring Security 的工作正在进行中。

配置中起实质性作用的是 <http>元素里面的<http-basic> 元素 – 这已经足够使整个应用都启用 Basic Authentication。Authentication Manager 不在本教程范围之内, 所以我们使用一个内存管理,并且用户和密码用纯文本格式来定义。

在web应用的web.xml 中启用 Spring Security已经在Spring Logout tutorial有过探讨。

lwei
lwei
翻译于 2013/06/04 11:20
1

3. 访问受保护的应用

curl 命令行是我们访问受保护应用要使用的工具。

首先, 让我们在不给出任何安全凭证的情况下访问 /homepage.html :

curl -i http://localhost:8080/spring-security-basic-auth/homepage.html

我们得到了预料中的401 Unauthorized 和 认证询问:

HTTP/1.1 401 Unauthorized
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=E5A8D3C16B65A0A007CFAACAEEE6916B; Path=/spring-security-basic-auth/; HttpOnly
WWW-Authenticate: Basic realm="Spring Security Application"
Content-Type: text/html;charset=utf-8
Content-Length: 1061
Date: Wed, 29 May 2013 15:14:08 GMT

浏览器会解析该认证询问并弹出一个简单的对话框,来让我们输入凭证,不过现在我们使用的是curl, 所以不用这样。

现在, 让我们请求同样的资源 – 主页 – 但是访问的同时也提供凭证:

curl -i --user user1:user1Pass http://localhost:8080/spring-security-basic-auth/homepage.html

现在,服务器的响应是200 OK ,还有一个Cookie:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=301225C7AE7C74B0892887389996785D; Path=/spring-security-basic-auth/; HttpOnly
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-US
Content-Length: 90
Date: Wed, 29 May 2013 15:19:38 GMT

从浏览器,本应用能被正常的访问 – 唯一不同的是登录页面将不再是强制需求,因为所有的浏览器都支持 Basic Authentication 并且使用对话框来要求用户输入凭证。

lwei
lwei
翻译于 2013/06/04 10:50
1

4. 进一步的配置 – 入口点

默认情况下, 由Spring Security提供的BasicAuthenticationEntryPoint 返回一个完整的401 Unauthorized 的html响应页面给客户端。html格式在浏览器中很好的展示了错误信息,但是对其他情形却不太适合,比如对一个 REST API 来说,json 格式会更好。

命名空间对这个新需求也是足够灵活的 – 为了解决此问题 – 入口点可以被重写:

<http-basic entry-point-ref="myBasicAuthenticationEntryPoint" />

新入口点被定义为标准的bean:

@Component
public class MyBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {

    @Override
    public void commence
      (HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx) 
      throws IOException, ServletException {
        response.addHeader("WWW-Authenticate", "Basic realm=\"" + getRealmName() + "\"");
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        PrintWriter writer = response.getWriter();
        writer.println("HTTP Status 401 - " + authEx.getMessage());
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        setRealmName("Baeldung");
        super.afterPropertiesSet();
    }
}

通过直接对HTTP Response编码,我们现在能完全控制response的格式。

lwei
lwei
翻译于 2013/06/04 10:29
1

5. Maven依赖

以前我们在Spring Security with Maven article中已经讨论过Spring SecurityMaven依赖问题 – 在运行时,我们将同时需要 spring-security-web 和 spring-security-config。

6. 结论

本例中,我们使用Spring Security 和 Basic Authentication对一个MVC应用进行安全防护. 我们讨论了XML 配置并且使用简单的curl命令行来访问该应用。 最后我们对具体的错误信息格式进行了处理 – 从标准的HTML 错误页面切换到自定义的文本或json格式。

如果项目在本机运行,样例页面可以从以下地址访问:

http://localhost:8080/spring-security-basic-auth/homepage.html

本Spring教程的实现可以在 the github project 中找到 – 这是一个 Eclipse 项目, 所以它很容易被导入并运行.

lwei
lwei
翻译于 2013/06/04 09:28
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(0)

返回顶部
顶部