Spring Security 3.1 多表单登录和认证
Posted
技术标签:
【中文标题】Spring Security 3.1 多表单登录和认证【英文标题】:Spring Security 3.1 Multiple form login and authentication 【发布时间】:2014-02-17 23:49:22 【问题描述】:我正在构建一个提供 2 个登录表单的项目,一个用于 member
,另一个用于 agent
,它们都不同,因此我有 2 个表(member
和 agent
)。我想为它们制作具有不同映射的登录表单。 /pages/agent
是agent
的形式,/
(项目的index.html
)是member
的形式。 /pages
是我的调度员。我尝试了很多方法都没有成功。
这是我的安全上下文:
<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-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<http pattern="/pages/*" authentication-manager-ref="agentAuth">
<intercept-url pattern="/pages/agentprofile*" access="ROLE_AGENT" />
<form-login login-page="/pages/agent" default-target-url="/pages/agentprofile" />
<logout logout-success-url="/pages/logout" logout-url="/pages/j_spring_security_logout" delete-cookies="JSESSIONID" />
</http>
<authentication-manager alias="agentAuth" id="agentAuth">
<authentication-provider >
<password-encoder hash="md5" />
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="select username, password, enable from agent where USERNAME=?"
authorities-by-username-query="select a.username, r.namaRole from agent a, role r where r.idRole = a.idRole and a.username = ?" />
</authentication-provider>
</authentication-manager>
<http authentication-manager-ref="memberAuth">
<intercept-url pattern="/pages/member*" access="ROLE_USER" />
<intercept-url pattern="/pages/myorder*" access="ROLE_USER" />
<intercept-url pattern="/pages/voucherbelanja*" access="ROLE_USER" />
<intercept-url pattern="/pages/rewardpoint*" access="ROLE_USER" />
<intercept-url pattern="/pages/myreview*" access="ROLE_USER" />
<intercept-url pattern="/pages/voucherhotel*" access="ROLE_USER" />
<form-login login-page="/" default-target-url="/pages/member"
authentication-failure-url="/pages/loginfailed" />
<form-login login-page="/pages/loginfailed"
default-target-url="/pages/member" authentication-failure-url="/pages/loginfailed"
authentication-success-handler-ref="loginSucessHandler" />
<logout logout-success-url="/pages/logout" logout-url="/pages/j_spring_security_logout" delete-cookies="JSESSIONID"/>
</http>
<authentication-manager alias="memberAuth" id="memberAuth">
<authentication-provider>
<password-encoder hash="md5" />
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="select username, password, enable from member where USERNAME=?"
authorities-by-username-query="select m.username, r.namaRole from member m, role r where r.idRole = m.idRole and m.username = ?" />
</authentication-provider>
</authentication-manager>
<beans:bean id="loginSuccessHandler" class="com.klik.service.LoginSuccessHandler" />
这是我在 web.xml 中的 spring 安全过滤器:
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
<url-pattern>/pages/*</url-pattern>
</filter-mapping>
【问题讨论】:
【参考方案1】:我也在尝试做类似的事情但失败了。所以我用谷歌搜索了这篇文章。
你有什么问题?你遇到了什么错误?
从你的配置来看,我觉得可能有问题:
1) 你先配置,<http pattern="/pages/*"
它将匹配所有以'pages'开头的url,然后成员url不能工作。
2) 在您的第二个配置中,有 2 个登录表单。
3) 在两个配置中,您有相同的注销 url。合适吗?我的意思是,spring security 如何决定哪个领域将注销?
【讨论】:
我认为问题是您成功登录时只创建了一次 JSESSIONID,而不是每个选项卡。因此,当我尝试使用已成功登录的成员打开 url /agentprofile 时,spring security 不会拦截它并提供拒绝访问页面,因为它被检测为 role_member 而不是 role_agent。真实条件不是拒绝该页面,但它应该提供代理的登录表单。问题仍未解决。 我的最终工作解决方案是,对于 2 个 http 配置,设置不同的领域,如“代理”和“用户”。对于用户,默认登录 url 为“user/j__check”,注销 url 为“user/j_logout”。如果我想获取登录用户的用户信息,url 应该以“/user”开头。而且我还需要为 2 个 http 配置设置模式。您为代理设置了 pattern="/pages/*"。并且此 url 也与用户的 url 匹配。所以我认为用户相关的安全配置不起作用。以上是关于Spring Security 3.1 多表单登录和认证的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security 3.1 - 发生会话超时时自动重定向到登录页面
如何使用 Spring Security 3.1 以编程方式登录用户
如何在 Spring 获取之前捕获 Spring Security 登录表单?