基于Spring安全的应用程序,同时具有登录和SSO

时间:2016-08-25 10:38:53

标签: spring-security

我搜索得足够多,但我没有得到明确的答案,因此发布了这个问题。

我有一个使用spring security进行身份验证的现有应用程序。 当前实现使用UsernamePasswordAuthenticationFilter的自定义实现来执行此操作。 因此,流程如下(非常简单):

inputrequest>的DelegatingFilterProxy> LoginUrlAuthenticationEntryPoint> CustomUsernamePasswordAuthenticationFilter>&的AuthenticationManager GT; CustomAuthenticationProvider

现在我需要在某些情况下实现SSO(因为用户已经被认证为需要进行身份验证)。

该要求规定如果我有一个特定的请求参数,那么我需要自动验证请求,而不必担心用户/密码。

所以它是同一组资源,如果存在特定的SSO相关请求参数,我不必验证用户/密码。

e.g 假设资源 \ test \ bus 是安全资源。

如果我来自正常方式,那么我们需要检查用户是否经过身份验证,或者强制用户输入有效的用户/密码

如果我来自SSO频道,那么我需要显示\ test \ bus资源,因为用户已经过身份验证。

目前所有访问限制都通过<http>元素

进行

例如security-config.xml的片段如下:                          

查询:在这种情况下,我有哪些选项。我可以考虑以下选项:

  1. 在Spring安全框架启动之前对用户进行预身份验证。这将意味着在调用spring安全筛选器之前创建一个身份验证令牌并放入spring上下文。这可以通过在弹簧安全过滤器链之前调用的另一个过滤器来完成。我已经测试了它并且有效。

  2. 创建另一个自定义安全筛选器,用于设置身份验证令牌。我不清楚这是否是正确的方法,因为我们不确定何时创建多个自定义安全过滤器

  3. 创建另一个自定义身份验证提供程序,例如SSOCustomAuthenticationProvider。此提供程序将在现有当前流程中调用,因为我们可以为身份验证管理器提供多个身份验证提供程序。唯一的问题是,为了实现这一点,我必须将请求URL更改为身份验证过滤器的目标URL,以便spring安全性不会检查身份验证。 解释更多,

  4. 让我们说请求uri是/test/bus,我会编写一个过滤器来拦截请求并将其更改为/ test / startlogin。这是我目前的CustomUsernamePasswordAuthenticationFilter的目标网址,即

    <property name="filterProcessesUrl" value="/test/startlogin"/>
    

    流程将是

    inputrequest&GT;的DelegatingFilterProxy&GT; LoginUrlAuthenticationEntryPoint&GT; CustomUsernamePasswordAuthenticationFilter&GT;&的AuthenticationManager GT; SSOCustomAuthenticationProvider

    我测试了这个并且这个有效。这是一种有效的方法还是黑客攻击。

    我还有其他可行的选择。

    感谢您阅读本文。

0 个答案:

没有答案