我搜索得足够多,但我没有得到明确的答案,因此发布了这个问题。
我有一个使用spring security进行身份验证的现有应用程序。 当前实现使用UsernamePasswordAuthenticationFilter的自定义实现来执行此操作。 因此,流程如下(非常简单):
inputrequest>的DelegatingFilterProxy> LoginUrlAuthenticationEntryPoint> CustomUsernamePasswordAuthenticationFilter>&的AuthenticationManager GT; CustomAuthenticationProvider
现在我需要在某些情况下实现SSO(因为用户已经被认证为需要进行身份验证)。
该要求规定如果我有一个特定的请求参数,那么我需要自动验证请求,而不必担心用户/密码。
所以它是同一组资源,如果存在特定的SSO相关请求参数,我不必验证用户/密码。
e.g 假设资源 \ test \ bus 是安全资源。
如果我来自正常方式,那么我们需要检查用户是否经过身份验证,或者强制用户输入有效的用户/密码
如果我来自SSO频道,那么我需要显示\ test \ bus资源,因为用户已经过身份验证。
目前所有访问限制都通过<http>
元素
例如security-config.xml的片段如下:
查询:在这种情况下,我有哪些选项。我可以考虑以下选项:
在Spring安全框架启动之前对用户进行预身份验证。这将意味着在调用spring安全筛选器之前创建一个身份验证令牌并放入spring上下文。这可以通过在弹簧安全过滤器链之前调用的另一个过滤器来完成。我已经测试了它并且有效。
创建另一个自定义安全筛选器,用于设置身份验证令牌。我不清楚这是否是正确的方法,因为我们不确定何时创建多个自定义安全过滤器
创建另一个自定义身份验证提供程序,例如SSOCustomAuthenticationProvider。此提供程序将在现有当前流程中调用,因为我们可以为身份验证管理器提供多个身份验证提供程序。唯一的问题是,为了实现这一点,我必须将请求URL更改为身份验证过滤器的目标URL,以便spring安全性不会检查身份验证。 解释更多,
让我们说请求uri是/test/bus
,我会编写一个过滤器来拦截请求并将其更改为/ test / startlogin。这是我目前的CustomUsernamePasswordAuthenticationFilter的目标网址,即
<property name="filterProcessesUrl" value="/test/startlogin"/>
流程将是
inputrequest&GT;的DelegatingFilterProxy&GT; LoginUrlAuthenticationEntryPoint&GT; CustomUsernamePasswordAuthenticationFilter&GT;&的AuthenticationManager GT; SSOCustomAuthenticationProvider
我测试了这个并且这个有效。这是一种有效的方法还是黑客攻击。
我还有其他可行的选择。
感谢您阅读本文。