我一直在使用Spring Security 3.x来处理我的项目的用户身份验证,到目前为止,它已经完美运行.
我最近收到了一个新项目的要求.在此项目中,它需要两组用户身份验证:一组用于根据LDAP对员工进行身份验证,另一组用于根据数据库对客户进行身份验证.我对如何在Spring Security中配置它感到有点困惑.
我最初的想法是创建一个具有以下字段的登录屏幕: -
j_username 用户字段.j_password 密码字段.如果用户选择"employee",那么我希望Spring Security针对LDAP对其进行身份验证,否则将根据数据库对凭据进行身份验证.但是,问题是表单将被提交,/j_spring_security_check并且我无法将单选按钮字段发送到我实现的自定义身份验证提供程序.我最初的想法是,我可能需要两个表单提交URL,而不是依赖于默认值/j_spring_security_check.每个URL都将由不同的身份验证提供程序处理,但我不确定如何在Spring Security中配置它.
我知道在Spring Security中,我可以配置后备身份验证,例如,如果LDAP身份验证失败,那么它将回退到数据库身份验证,但这不是我在这个新项目中拍摄的内容.
有人可以分享我应该如何在Spring Security 3.x中配置它?
谢谢.
更新 - 01-28-2011 - @ EasyAngel的技术
我正在尝试执行以下操作: -
/j_spring_security_check_for_employee/j_spring_security_check_for_customer我想要2种不同的表单登录的原因是允许我根据用户不同地处理身份验证,而不是进行后备身份验证.在我的情况下,员工和客户可能拥有相同的用户ID.
我合并了@ EasyAngel的想法,但必须更换一些已弃用的类.我目前面临的问题是没有过滤进程URLS似乎在Spring Security中注册,因为我不断获取Error 404: SRVE0190E: File not found: /j_spring_security_check_for_employee.我的直觉是springSecurityFilterChainbean没有正确连接,因此根本不使用我的自定义过滤器.
顺便说一下,我正在使用WebSphere,我确实com.ibm.ws.webcontainer.invokefilterscompatibility=true在服务器中设置了属性.我可以/j_spring_security_check毫无问题地达到默认值.
这是我完整的安全配置: -
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:sec="http://www.springframework.org/schema/security" 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.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">
<sec:http auto-config="true">
<sec:form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1" default-target-url="/welcome.jsp"
always-use-default-target="true" />
<sec:logout …Run Code Online (Sandbox Code Playgroud) java authentication spring forms-authentication spring-security
我有一个使用Spring Security保护的Web应用程序,需要两个单独的登录表单.这两种登录表单需要完全独立.我的意思是不同的登录表单,不同的URL路径,每个人也可以拥有不同的身份验证管理器.
我已经浏览了整个谷歌并且有一些方法可以做到这一点,但我已阅读并看到过去几周的一些更改应该可以在代码的最新快照版本中轻松完成此操作.
首先,由于这个错误是完整的SEC-1171,我们现在可以有多个名称空间元素来支持多个过滤器链配置.
其次,正如其他错误显示SEC-1847,我们现在能够为每个http标签选择自定义身份验证管理器.
问题是我已下载,编译了所有内容,但我的xsd不允许我为每个http标签创建自定义auth管理器,每当我尝试更改登录处理URL或每次尝试使用记住每个登录表单的密钥.
我开始做这样的事情:
<!-- Configure realm for administration users -->
<http pattern="/admin/**" auto-config="true" disable-url-rewriting="true" >
<intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
<form-login login-page="/adminLogin.htm" default-target-url="/"
login-processing-url="/loginProcessing"
authentication-failure-url="/adminLogin.htm?error" />
<logout invalidate-session="true" logout-success-url="/" logout-url="/logout" />
<remember-me key="******" user-service-ref="userDetailsService" />
</http>
<!-- Configure realm for standard users -->
<http auto-config="true" disable-url-rewriting="true">
<intercept-url pattern="/user/**" access="ROLE_USER" />
<form-login login-page="/login.htm" default-target-url="/"
login-processing-url="/loginProcessing"
authentication-failure-url="/login.htm?error" />
<logout invalidate-session="true" logout-success-url="/" logout-url="/logout" />
<remember-me key="******" user-service-ref="userDetailsService" />
</http>
<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="userDetailsService" >
<password-encoder ref="passwordEncoder"/> …Run Code Online (Sandbox Code Playgroud) 我在我的Spring MVC应用程序上启用了Rest支持,并AuthenticationEntryPoint在我的security-context.xml上设置为
<http auto-config="false" use-expressions="true"
disable-url-rewriting="true" entry-point-ref="restAuthenticationEntryPoint">
Run Code Online (Sandbox Code Playgroud)
RestAuthenticationEntryPoint.java
@Component
public final class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(final HttpServletRequest request, final HttpServletResponse response, final AuthenticationException authException) throws IOException {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
}
}
Run Code Online (Sandbox Code Playgroud)
每当任何用户尝试访问资源而不进行身份验证时,都会出现以下错误:
HTTP Status 401 - Unauthorized
Run Code Online (Sandbox Code Playgroud)
以上行为仅适用于Rest服务.但是,如果用户尚未通过身份验证,我希望具有将用户重定向到登录页面以进行正常Web请求的默认行为.怎么做到这一点?
我试图解开/**模式,但到目前为止我的所有尝试都是徒劳的.
这就是我正在做的事情:
<security:intercept-url pattern="/**" filters="none" />
Run Code Online (Sandbox Code Playgroud)
我的配置不再包含任何intercept-url定义.
但是在访问任何URL后,我仍然会被重定向到默认入口点...
我调试了spring安全源,我实际上可以看到为我正在尝试访问的URL加载的过滤器.(FilterChainProxy行:154,filters列表已满)
任何洞察为什么会发生这种情况以及如何取消保护/**将非常感激.
我正在使用3.0.5.RELEASE
编辑:
安全配置:
<security:http auto-config="false" use-expressions="true" entry-point-ref="loginUrlAuthenticationEntryPoint">
<!-- dev --><security:intercept-url pattern="/**" filters="none" />
<security:custom-filter position="FORM_LOGIN_FILTER" ref="absoluteUrlSsoFilter" />
</security:http>
<security:authentication-manager>
<security:authentication-provider user-service-ref="ssoDetailsService" />
</security:authentication-manager>
Run Code Online (Sandbox Code Playgroud)
这是相关部分,我也可以给你bean定义,但我怀疑问题是存在的.