springsecurity basic 认证
Basic Access Authentication scheme是在HTTP1.0提出的认证方法,它是一种基于challenge/response的认证模式,针对特定的realm需要提供用户名和密码认证后才可访问,其中密码使用明文传输。
Basic 认证是HTTP 中非常简单的认证方式,因为简单,所以不是很安全,不过仍然非常常用。
Basic模式认证过程如下:
①浏览器发送http报文请求一个受保护的资源。
②服务端的web容器将http响应报文的响应码设为401,响应头部加入WWW-Authenticate: Basic realm=”xxx”。
③浏览器会弹出默认对话框让用户输入用户名和密码,并用Base64进行编码,实际是用户名+冒号+密码进行Base64编码,即Base64(username:password),然后浏览器就会在HTTP报文头部加入这个编码,形如:Authorization: Basic YWRtaW46YWRtaW4=
。
④服务端web容器获取HTTP报文头部相关认证信息,匹配此用户名与密码是否正确,是否有相应资源的权限,如果认证成功则返回相关资源,否则再执行②,重新进行认证。
⑤以后每次访问都要带上认证头部。
Basic认证的优点是基本上所有流行的网页浏览器都支持,一般被用在受信赖的或安全性要求不高的系统中(如路由器配置页面的认证,tomcat管理界面认证)
缺点是,用户名密码基本等于是明文传输带来很大风险,并且没有注销认证信息的手段,只能依靠关闭浏览器退出认证。
springsecurity中处理basic认证的是spring-security-web-4.1.2.RELEASE 中的org.springframework.security.web.authentication.www.BasicAuthenticationFilter。
核心代码如下:
//获取报文头部的Authorization: BasicYWRtaW46YWRtaW4= ,判断是否是basic认证
String header = request.getHeader("Authorization"); if (header == null || !header.startsWith("Basic ")) { chain.doFilter(request, response); return; } try { String[] tokens = extractAndDecodeHeader(header, request); assert tokens.length == 2; String username = tokens[0];if (authenticationIsRequired(username)) {
//解码后取出用户名密码生成spring-security的认证对象 UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken( username, tokens[1]); authRequest.setDetails( this.authenticationDetailsSource.buildDetails(request)); Authentication authResult = this.authenticationManager .authenticate(authRequest); if (debug) { this.logger.debug("Authentication success: " + authResult); } //认证结果设置到SecurityContext中 SecurityContextHolder.getContext().setAuthentication(authResult); this.rememberMeServices.loginSuccess(request, response, authResult); onSuccessfulAuthentication(request, response, authResult); } }
以上就是basic认证和spring-security中的拦截方式。