本教程展示了如何用spring创建、配置和自定义Basic Authentication. 我们将把我们的教程构建在简单的 Spring MVC example例子之上, 然后使用Spring Security提供的Basic Auth机制来保护该MVC应用的UI。
<?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有过探讨。
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 并且使用对话框来要求用户输入凭证。
默认情况下, 由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的格式。
以前我们在Spring Security with Maven article中已经讨论过Spring Security的Maven依赖问题 – 在运行时,我们将同时需要 spring-security-web 和 spring-security-config。
本例中,我们使用Spring Security 和 Basic Authentication对一个MVC应用进行安全防护. 我们讨论了XML 配置并且使用简单的curl命令行来访问该应用。 最后我们对具体的错误信息格式进行了处理 – 从标准的HTML 错误页面切换到自定义的文本或json格式。
如果项目在本机运行,样例页面可以从以下地址访问:
http://localhost:8080/spring-security-basic-auth/homepage.html
本Spring教程的实现可以在 the github project 中找到 – 这是一个 Eclipse 项目, 所以它很容易被导入并运行.
评论删除后,数据将无法恢复
评论(0)