【问题标题】:Can i put 3 different authentication schemes in same spring security configuration?我可以在同一个弹簧安全配置中放置 3 个不同的身份验证方案吗?
【发布时间】:2010-12-13 07:22:37
【问题描述】:

我的要求是提供:

  1. 基于用户名密码的身份验证。
  2. 基于开放 id 的身份验证
  3. 基于 URL 的身份验证(它是我们拥有的自定义 sso 实现)

在同一个项目中。

我尝试将 Spring 安全性插入到现有项目中(为简单起见,代码被剥离):

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation=
    "http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">

    <http auto-config="false">
        <remember-me user-service-ref="rememberMeUserService" key="some custom key" /> <!-- TODO: Key made for testing reasons.... -->
        <intercept-url pattern='/mainApplication/Main screen.html' access="ROLE_ADMIN"/>
        <intercept-url pattern='/**' filters="none"/> <!-- Allow entry to login screen -->
        <openid-login authentication-failure-url="/Login.html?error=true" default-target-url="/mainApplication/Main screen.html" user-service-ref="openIdUserService"/>
        <form-login login-page="/Login.html" authentication-failure-url="/Login.html?error=true" always-use-default-target="true" default-target-url="/mainApplication/Main screen.html"/>
    </http>

    <beans:bean id="rememberMeUserService" class="mypackage.CustomUserService">
        <beans:property name="usersService" ref="usersService"></beans:property>
    </beans:bean>

    <!-- Common login shared entry-point for both Form and OpenID based logins -->    
    <beans:bean id="entryPoint" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint">
        <beans:property name="loginFormUrl" value="/Login.html" />
    </beans:bean>
    <authentication-manager alias="authenticationManager"/>

    <beans:bean id="MyCustomAuthenticationProvider" class="mypackage.CustomAuthenticationProvider">
        <custom-authentication-provider />
        <beans:property name="usersService" ref="usersService"></beans:property>
    </beans:bean>

    <beans:bean id="openIdAuthenticationProvider" class="org.springframework.security.providers.openid.OpenIDAuthenticationProvider">
        <custom-authentication-provider />
        <beans:property name="userDetailsService" ref="openIdUserService"/>
    </beans:bean>

    <beans:bean id="openIdUserService" class="mypackage.OpenIDUserDetailsService">
        <beans:property name="usersService" ref="usersService"/>
    </beans:bean>

    <!-- Great, now i want to include SSO based sign on -->
    <!-- need to intercept a url of the form :   /myApp/customLogin/<key> where <key> is my token key   -->

</beans:beans>

如上所述,我需要跟踪表单的 url:/myApp/customLogin/12345 其中 1235 是我们最初使用的令牌密钥(为简单起见,代码被删除)

<servlet-mapping>
    <servlet-name>mySSOCapture</servlet-name>
    <url-pattern>/myApp/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/MyServlet</url-pattern>
</servlet-mapping>

我应该在这里做什么来启用 Spring Security 来帮助我管理这第三个身份验证方案?

一个必然的问题是: 我可以在同一个项目中有多个身份验证提供程序吗? 如果是,那么它们如何与不同的功能相匹配(例如,一种提供基于 url 的身份验证,一种提供匿名身份验证等)?

【问题讨论】:

  • sso :单点登录(用户仅通过令牌进行身份验证)。上面写的 servlet-mapping 在我的 web.xml 中。 Open id 身份验证和用户名密码身份验证工作正常。我的登录页面包含两种形式,一种用于正常登录,另一种用于基于 Open id 的登录。

标签: java spring configuration spring-security


【解决方案1】:

无法直接回答这个问题,但来自身份管理部门的“有用提示”:并非所有身份验证系统都具有相同的信任值 - 平等对待它们严重违反了良好的安全设计。

我希望这对您的设计有所帮助...

【讨论】:

  • 嗯,它确实为我的问题增加了一个哲学维度:我不明白这个答案的意义
  • 我只是在建议一些需要注意的事项。抱歉,如果它不适用于您。
【解决方案2】:

可能有几种方法可以做到这一点。有一些功能非常相似,即Pre-authentication。这是一个很好的例子,您可以添加一个自定义过滤器来验证用户,然后框架的其余部分应该接管。

AuthenticationProvider 所做的是检查由前一个过滤器加载到会话中的 Authentication 对象。您可以使用身份验证管理器注册任意数量的身份验证提供程序(它只是通过所有身份验证管理器运行Authentication 对象),但是您必须设法在其中获取一些过滤器来处理您的身份验证方案并填充@ 987654325@ 对象。如果您希望此过滤器也与用户交互(即显示登录表单或其他内容),它可能会干扰其他过滤器。在这种情况下,您可以使用单独的过滤器链,但这听起来不像您的情况是必要的。

【讨论】:

  • 我读到了 PreAuthentication,我认为你对我的问题有误,我想允许用户以 3 种不同的方式登录:用户名/密码、Open Id、SSO。
  • 我非常感谢有关身份验证管理器的额外信息,infor 已经清除了我的一些基础知识,我不确定你对过滤器链的意思。
  • 抱歉,我认为您的登录方案与其他登录方案差异太大,无法很好地融入其中。至于过滤器链,基本上所有请求都会经过一个弹簧安全过滤器链,但如果需要,您可以设置两个或更多,对不同的 URL 进行过滤。这样您就可以使用完全不同的过滤器/身份验证机制,但它会变得有点复杂。
【解决方案3】:

好的,解决方法如下:

<beans:bean id="mySsoFilter" class="somePackage.MySsoProcessingFilter">
    <custom-filter after="CAS_PROCESSING_FILTER"/> <!-- Just a reference Point-->
    <beans:property name="authenticationManager" ref="authenticationManager"/>
    <beans:property name="defaultTargetUrl" value='/mainApplication/Main screen.html' />
    <beans:property name="authenticationFailureUrl" value="/Login.html?error=true"/>
</beans:bean>

希望对有需要的人有所帮助...

【讨论】:

  • 就像我使用“之后”一样,我也使用“之前”来添加另一个 SSO !请注意,CAS 与我的系统无关。
猜你喜欢
  • 1970-01-01
  • 2013-12-08
  • 2021-03-02
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
相关资源
最近更新 更多