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 个表(memberagent)。我想为它们制作具有不同映射的登录表单。 /pages/agentagent 的形式,/(项目的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) 你先配置,&lt;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 登录表单?

Spring Security:绕过登录表单

如何使用 Spring Security / Spring MVC 处理表单登录

未调用 Spring Security 自定义登录表单