SpringSecurity可以在不同的认证环境中运行。当我们建议用户使用SpringSecurity进行身份验证,但不建议集成到容器管理的身份验证中时,当您集成到自己的身份验证系统中时,它仍然支持。
1。SpringSecurity中的认证是什么?
现在让我们考虑一下大家都熟悉的标准身份认证场景:
(1)用户打算使用用户名和密码登录系统。
(2)系统验证用户名和密码是否合法。
(3)获取用户的上下文信息(角色等信息)
(4)为用户建立安全上下文。
(5)接下来,用户可以在权限访问机制下执行一些受保护的 *** 作,以检查与当前安全上下文相关的必要权限。
前三步是身份认证的过程,接下来看身份认证的详细过程:
(1)获取用户名和密码后,组合成一个usernamepasswordAuthenticationtoken的实例(前面讨论的认证接口的实例)。
(2)将令牌传递给AuthenticationManager实例进行验证。
(3)验证成功后,AuthenticationManager将返回填充好的认证实例。
(4)通过调用SecurityContextHolder建立安全上下文的实例。GetContext()。SetAuthentication(...)并将其传递给返回的身份验证对象。
以下是用于身份验证的代码片段:
我们编写了一个小程序,要求用户输入用户名和密码,并执行上述序列。我们实现的AuthenticationManager验证用户名和密码是否一致,并为每个用户分配一个角色。上面的输出与此类似:
favboy
请输入您的密码:
favccxx
认证失败:错误的凭证
请输入您的用户名:
favboy
请输入您的密码:
favboy
成功认证。安全上下文包含:\
org.springframework.security.authentication.usernamepasswordtauthenticationtoken@441d0230:\
校长:鲍勃;密码:[受保护];\
已验证:真;详细信息:空;\
授予的权限:角色_用户
注意,你通常不需要写任何代码。这个过程通常发生在内部,例如web身份验证过滤器。上面的代码只是告诉我们在SpringSecurity中使用身份验证是多么简单。当SecurityContextHolder包含已填充的身份验证对象时,用户身份就完成了。
2。直接设置SecurityContextHolder的内容
实际上,SpringSecurity并不关心如何将认证对象放在SecurityContextHolder中。唯一的关键是SecurityContextHolder需要有一个身份验证对象,然后用户才能 *** 作经过身份验证的AbstractSecurityInterceptor。
对于那些不是Spring安全的系统,可以编写自己的过滤器或MVC控制器来与认证系统集成。例如,您可以使用容器管理的身份验证系统从ThreadLocal或JNDI获取用户。也许你在一家有遗留认证体系的公司工作,这是企业的“标配”,对此你无能为力。在这种情况下,使用SpringSecurity提供认证是非常容易的。你只需要写一个过滤器来读取第三方的用户信息,然后构建一个Spring安全专用的认证对象,放在AuthenticationContextHolder中。在这种情况下,你需要考虑自己身份认证的基本信息。例如,在响应客户端之前,您需要创建一个HTTP会话会话来缓存请求之间的上下文。
3在Web应用程序中使用身份验证
接下来,让我们探索如何使用SpringSecurity进行身份验证,以及当Web应用程序没有配置web.xml安全策略时,如何建立用户身份验证和安全上下文。
以下是web应用程序认证的过程:
(1)访问一个应用程序的主页并点击一个链接。
(2)向服务器发送请求,服务器判断用户是否正在访问受保护的资源。
(3)因为用户之前没有经过认证,所以服务器发送一个响应(这个响应可能是HTTP响应代码,也可能直接跳转到一个网页)告诉用户,用户必须经过认证。
(4)认证机制决定浏览器是跳转到特定的网页供用户填写表单表单,还是浏览器以某种方式(基本认证对话框、cookie或X.509证书)检索用户的身份。
(5)浏览器将响应(包含表单信息的HTTPPOST请求或包含用户认证细节的HTTP报头)发送回服务器。
(6)接下来,服务器将决定先前的凭证是否有效。如果有效,就进行下一步。否则,浏览器通常会询问是否需要重试。
(7)原始请求将导致重新进行认证过程。重新判断用户有足够的权限访问受保护的资源。如果用户有权限,则请求成功。否则会返回HTTP错误代码403,表示用户没有 *** 作权限。
安全有特定的类负责以上步骤。主要的类是ExceptionTranslationFilter、AuthenticationEntryPoint和调用AuenticationManager的“身份验证机制”。
3.1ExceptionTranslationFilter
顾名思义,ExceptionTranslationFilter是一个在SpringSecurity中处理异常的过滤器,这些异常是由AbstractSecurityInterceptor抛出的,它提供认证服务。
3.2认证输入点
上面第3步中的 *** 作由AuthenticationEntryPoint负责。可以想象,每个web应用程序都有一个默认的身份验证测试,每个主要的身份验证系统都有一个AuthenticationEntrypoint实现,通常执行步骤3中描述的 *** 作之一。
3.3认证机制
一旦您的浏览器提交了身份验证证书(HTTPformPOST或HTTPheader),它就需要在服务器上保存这个权限信息。但是现在转到上面的第6步。在SpringSecurity中,我们对手机认证信息的 *** 作有一个特定的名称。从用户代理(通常是浏览器),称之为“认证机制”。例如基于表单的登录或基本身份验证。从用户代理收集身份验证细节后,将构建身份验证请求对象,然后提交给AuthenticationManager。
在身份验证机制收到填充的身份验证对象后,它将认为请求是合法的,将身份验证放入SecurityContextHolder,然后重试原始请求(步骤7)。另一方面,如果AuthenticationManager拒绝请求,身份验证机制将让用户代理重试(步骤2)。
3.4在请求之间保存安全上下文
[/s2/]
根据应用程序类型,需要一个策略来保存用户 *** 作之间的安全上下文。在典型的web应用程序中,用户的登录日志由其会话id决定,服务器缓存主题信息以保持会话会话。在SpringSecurityContext中,在请求之间存储SecurityContextPersistenceFilter的责任落在SecurityContextPersistenceFilter身上。默认情况下,SecurityContextPersistenceFilter将在HTTP请求中的HttpSession属性上存储上下文。每个请求的上下文都存储在SecurityContextHolder上,最重要的是,当请求完成时,它会清除SecurityContextHolder。为了安全起见,用户不要直接 *** 作HttpSession。这里有一个实现它的简单方法——改用SecurityContextHolder。
许多其他类型的应用程序(如无状态RESTWeb服务)不会使用HTTP会话,并且每次请求时都会重新验证。但是在请求链中包含SecurityContextPersistenceFilter还是很重要的,这样才能保证每次请求后SecurityContextHolder都会被清除空。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)