我的要求是提供:
基于用户ID密码的身份验证。
开放式基于身份的身份验证
基于url的身份验证(这是我们的自定义sso实现)
在同一个项目中。
我曾尝试将Spring Security 作为插件插入到现有项目中(为简单起见,将代码剥离):
<?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的身份验证,一个提供匿名身份验证等等)?
3条答案
按热度按时间qf9go6mv1#
可能有几种方法可以做到这一点。有一些功能可以做一些非常类似的事情,即预身份验证。这是一个很好的例子,说明可以添加一个对用户进行身份验证的自定义过滤器,然后由框架的其余部分接管。
真是个好消息
AuthenticationProvider
是不是在检查Authentication
对象,该对象由以前的筛选器加载到会话中。您可以使用身份验证管理器(只需运行Authentication
对象),但您必须设法在其中获取一些过滤器,这些过滤器将处理您的身份验证方案并填充Authentication
对象。如果您希望此筛选器也与用户交互(即显示登录窗体或其他内容),它可能会干扰其他筛选器。在这种情况下,您可以使用单独的过滤器链,但这听起来不像是必要的,在您的情况下。oalqel3c2#
不能直接回答这个问题,但来自身份管理部门的一个“有用的提示”:并不是所有的身份验证系统都有相同的信任值——平等对待它们是对良好安全设计的严重违反。
我希望这对你的设计有帮助。。。
wn9m85ua3#
好吧,解决办法是:
希望这能帮助有需要的人。。。