`
Wind_ZhongGang
  • 浏览: 263752 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Spring Security 3多用户登录实现之三 验证过滤器

 
阅读更多

     当填写完成登录表单提交后,首先会被对应的提交表单提起的过滤器进行拦截,这里过滤器的作用就是拦截登录表单提交验证请求,并根据相应的表单信息构造对应的登录凭证,这里来看看过滤器是如何构造相应的用户凭证。

 

 

package com.template.security.filter;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 12-11-9
 * Time: 下午10:00
 */
public class MultipleAuthenticationProcessingFilter extends AbstractAuthenticationProcessingFilter {
    private List<AuthenticationTokenResolver> tokenResolvers = new ArrayList<AuthenticationTokenResolver>();

    /**
     * @param defaultFilterProcessesUrl the default value for <tt>filterProcessesUrl</tt>.
     */
    protected MultipleAuthenticationProcessingFilter(String defaultFilterProcessesUrl) {
        super(defaultFilterProcessesUrl);
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
        for (AuthenticationTokenResolver tokenResolver : tokenResolvers) {
            if (tokenResolver.support(request)) {
                Authentication authentication = tokenResolver.resolve(request);
                return this.getAuthenticationManager().authenticate(authentication);
            }
        }

        throw new UnsupportedOperationException("No authentication token resolver found!");
    }

    public void setTokenResolvers(List<AuthenticationTokenResolver> tokenResolvers) {
        this.tokenResolvers = tokenResolvers;
    }
}

 

 

package com.template.security.filter;

import org.springframework.security.core.Authentication;

import javax.servlet.http.HttpServletRequest;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 12-11-9
 * Time: 下午10:08
 */
public interface AuthenticationTokenResolver {

    boolean support(HttpServletRequest request);


    Authentication resolve(HttpServletRequest request);

}

 

 

package com.template.security.filter;

import com.template.utils.StringUtils;
import org.springframework.security.core.Authentication;

import javax.servlet.http.HttpServletRequest;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 12-11-9
 * Time: 下午10:27
 */
public abstract class AbstractAuthenticationTokenResolver implements AuthenticationTokenResolver {
    protected String parameterName;
    protected String parameterValue;

    protected AbstractAuthenticationTokenResolver() {
    }

    protected AbstractAuthenticationTokenResolver(String parameterName) {
        this.parameterName = parameterName;
    }

    @Override
    public boolean support(HttpServletRequest request) {
        String parameterValue = request.getParameter(parameterName);
        if (StringUtils.isEmpty(parameterValue)) {
            return false;
        }
        return parameterValue.equals(this.parameterValue);
    }

    @Override
    public abstract Authentication resolve(HttpServletRequest request);

    public void setParameterName(String parameterName) {
        this.parameterName = parameterName;
    }

    public void setParameterValue(String parameterValue) {
        this.parameterValue = parameterValue;
    }
}

 

 

package com.template.security.filter;

import com.template.security.authentication.token.BackendAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 12-11-9
 * Time: 下午10:29
 */
public class BackendAuthenticationTokenResolver extends AbstractAuthenticationTokenResolver {

    protected BackendAuthenticationTokenResolver() {
        super();
    }

    @Override
    public Authentication resolve(HttpServletRequest request) {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String captcha = request.getParameter("captcha");
        List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
        return new BackendAuthenticationToken(username, password, authorities, captcha);
    }
}

 

 

package com.template.security.filter;

import com.template.security.authentication.token.ForendAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 12-11-9
 * Time: 下午10:29
 */
public class ForendAuthenticationTokenResolver extends AbstractAuthenticationTokenResolver {

    protected ForendAuthenticationTokenResolver() {
        super();
    }

    @Override
    public Authentication resolve(HttpServletRequest request) {
        String email = request.getParameter("email");
        String phone = request.getParameter("phone");
        List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
        return new ForendAuthenticationToken(email, phone, authorities);
    }

}

 

    这里实现AbstractAuthenticationProcessingFilter接口的类MultipleAuthenticationProcessingFilter,用来根据相应的登录表单提交信息构造相应的登录用户凭证。为了实现根据前台登录表单信息构造前台用户凭证,根据后台登录表单信息构造后台用户凭证,使用了策略模式来实现,实现AbstractAuthenticationTokenResolver接口的BackendAuthenticationTokenResolver和ForendAuthenticationTokenResolver分别用来构造后台用户凭证和前台用户凭证,再来看看配置文件是如何进行配置的吧。

 

 

<beans:bean id="multipleAuthenticationProcessingFilter"
                class="com.template.security.filter.MultipleAuthenticationProcessingFilter">
        <beans:constructor-arg value="/login/check"/>
        <beans:property name="tokenResolvers">
            <beans:list>
                <beans:ref bean="backendAuthenticationTokenResolver"/>
                <beans:ref bean="forendAuthenticationTokenResolver"/>
            </beans:list>
        </beans:property>
        <beans:property name="authenticationManager" ref="authenticationManager"/>
        <beans:property name="authenticationSuccessHandler" ref="multipleAuthenticationSuccessHandler"/>
        <beans:property name="authenticationFailureHandler" ref="multipleAuthenticationFailureHandler"/>
    </beans:bean>

    <beans:bean id="backendAuthenticationTokenResolver"
                class="com.template.security.filter.BackendAuthenticationTokenResolver">
        <beans:property name="parameterName" value="token"/>
        <beans:property name="parameterValue" value="backend"/>
    </beans:bean>

    <beans:bean id="forendAuthenticationTokenResolver"
                class="com.template.security.filter.ForendAuthenticationTokenResolver">
        <beans:property name="parameterName" value="token"/>
        <beans:property name="parameterValue" value="forend"/>
    </beans:bean>
 

    这里不论是前台登录还是后台登录,都提交到相同的地址/login/check,不过为了区分请求到底是前台登录认证还是后台登录认证,这里使用了一个名为token的请求参数来区分,当token的值为backend的时候表明是后台登录认证,当token的值为forend的时候表明是前台登录认证。

 

   <custom-filter ref="multipleAuthenticationProcessingFilter" before="FORM_LOGIN_FILTER"/>

 

   这段配置表明自定义的认证过滤器将在Spring Security默认的UsernamePasswordAuthenticationFilter前执行,研究UsernamePasswordAuthenticationFilter源码你就会发现平时使用到的登录认证请求地址j_spring_security_check就是被这个过滤器进行拦截并进行处理的,所以如果只是简单的登录认证,你只需要在登录页面进行一些修改就完成可以了,因为后台的处理已经完全交由Spring Security来帮我们处理了。

分享到:
评论
6 楼 xurunchengof 2017-01-11  
[url][url][url][img][img][img][img][img][img][img]
[b][i][u]
引用
[list]
[*][url][flash=200,200][/flash][/url]
[/list]
[/u][/i][/b]
[/img][/img][/img][/img][/img][/img][/img][/url][/url][/url]
5 楼 Wind_ZhongGang 2014-04-17  
余何娜 写道
楼主可在,看不出选择不同的Authentication的判断条件

for (AuthenticationTokenResolver tokenResolver : tokenResolvers) { 
            if (tokenResolver.support(request)) { 
                Authentication authentication = tokenResolver.resolve(request); 
                return this.getAuthenticationManager().authenticate(authentication); 
            } 
        }

这里
4 楼 余何娜 2014-04-01  
楼主可在,看不出选择不同的Authentication的判断条件
3 楼 Wind_ZhongGang 2012-11-26  
xumin_wlt 写道
成功了,因为我用的是struts2 的注解写法,花了老半天总算出来了,非常感谢。不过还是希望作者能解释下。


<form action="/login/check?token=backend" method="post">
表示登录表单提交的地址

<beans:bean id="multipleAuthenticationProcessingFilter" 
                class="com.template.security.filter.MultipleAuthenticationProcessingFilter"> 
        <beans:constructor-arg value="/login/check"/> 

表示登录表单提交地址对应的处理过滤器

这里是没有对应的构造器的,完全由过滤器对登录表单提交地址进行处理
2 楼 xumin_wlt 2012-11-25  
成功了,因为我用的是struts2 的注解写法,花了老半天总算出来了,非常感谢。不过还是希望作者能解释下。
1 楼 xumin_wlt 2012-11-24  
想问一下 这里的SpringMVC的login/check 有没有对应的controler呢?这里是构造一个地址的意思吗?

<form action="/login/check?token=backend" method="post"> 和
<beans:bean id="multipleAuthenticationProcessingFilter" 
                class="com.template.security.filter.MultipleAuthenticationProcessingFilter"> 
        <beans:constructor-arg value="/login/check"/> 

分别是什么意思呢?期待帮助。

相关推荐

    Spring Security 3多用户登录实现一

    **Spring Security 3 多用户登录实现详解** Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架,广泛应用于Java EE平台上的安全解决方案。在本文中,我们将深入探讨如何在Spring Security 3中实现...

    springSecurity 实现传参

    在这个场景中,我们关注的是如何使用Spring Security实现登录验证以及在登录过程中传递参数,特别是记录并返回用户登录前的页面。我们将深入探讨这个过程,并结合MySQL数据库的使用。 首先,让我们了解Spring ...

    SpringBoot + SpringSecurity + JPA 实现用户角色权限登录认证

    本项目结合了SpringBoot、SpringSecurity以及JPA(Java Persistence API),实现了用户角色权限的登录认证功能。以下是关于这些技术及实现过程的详细讲解。 1. **SpringBoot**:SpringBoot简化了Spring应用的初始...

    Spring Cloud Gateway 整合 Spring Security 统一登录认证鉴权

    通过自定义过滤器,我们可以实现复杂的业务逻辑,比如身份验证和权限控制。 接下来,我们关注Spring Security。它是一个灵活且可扩展的安全框架,支持多种认证和授权机制。在微服务架构中,Spring Security 可以...

    spring security3 中文版本

    - **配置 web.xml**:在 web.xml 文件中配置 Spring Security 的过滤器链。 - **最小 `&lt;http&gt;` 配置**:使用 `&lt;http&gt;` 元素可以轻松地配置 HTTP 认证和授权规则。 - **自动配置**:`auto-config` 属性可以自动配置...

    Spring Security 3.pdf

    Spring Security 是一个强大的Java安全框架,专为Java和Spring生态系统设计,用于实现全面的身份验证、授权和服务级安全功能。在Spring Security 3版本中,它引入了许多改进和新特性,以适应不断变化的安全需求和...

    单点登录SSO解决方案之SpringSecurity+JWT实现.docx

    ### 单点登录SSO解决方案之SpringSecurity+JWT实现 #### 一、单点登录(SSO)概述 单点登录(Single Sign-On,简称SSO)是一种认证机制,允许用户仅通过一次登录就能访问同一域下的多个应用程序和服务。这种机制...

    Spring Security-3中文官方文档(及教程)

    3. **过滤器链**:Spring Security的核心是其过滤器链,包括登录过滤器、CSRF保护、会话管理等。这些过滤器按照特定顺序执行,确保每个请求都经过安全检查。 4. **会话管理**:Spring Security可以实现会话固定保护...

    Spring Security 3 中文 chm

    3. **过滤器链(Filter Chain)**:Spring Security 的核心是过滤器链,它由一系列预定义的安全过滤器组成,这些过滤器处理HTTP请求并应用安全策略。例如,`HttpServletRequestWrapperFilter`用于包装请求,`...

    spring security + oauth 2.0 实现单点登录、认证授权

    - 它的核心组件包括过滤器链,如`DelegatingAuthenticationEntryPoint`和`RememberMeAuthenticationFilter`,这些组件协同工作以实现无状态的HTTP请求处理。 - Spring Security支持多种认证方式,如HTTP Basic、...

    springSecurity3例子

    - Spring Security 3引入了CSRF(跨站请求伪造)防护,通过添加一个不可预测的令牌到表单提交中,防止恶意第三方发起未经授权的操作。 5. **国际化支持**: - 支持多语言界面,可以根据用户的首选语言显示错误...

    spring security 完整项目实例

    总之,这个"spring security 完整项目实例"涵盖了Spring Security的核心组件和用法,包括用户管理、身份验证、权限控制、会话管理等多个方面。通过学习和实践这个项目,开发者能够深入理解Spring Security的工作原理...

    springsecurity学习笔记

    4. **Filter Chain**:Spring Security通过一系列过滤器形成一个过滤链,每个过滤器都有特定的任务,如BasicAuthenticationFilter处理基本认证,RememberMeAuthenticationFilter处理记住我功能等。 5. **Session ...

    Spring_Security_多页面登录配置教程

    `LogoutFilter`是Spring Security提供的用于处理用户注销请求的过滤器。 示例代码如下: ```xml &lt;!-- 商户注销 --&gt; &lt;bean id="shopLogoutFilter" class="org.springframework.security.web.logout.LogoutFilter"&gt; ...

    springsecurity原理流程图.pdf

    Spring Security的过滤器链是一种职责链设计模式,允许用户按照特定顺序添加多个过滤器来处理请求。 b. 除了AbstractAuthenticationProcessingFilter之外,过滤器链中还包括诸如ExceptionTranslationFilter、...

    spring spring security2.5 jar

    3. **过滤器链**:Spring Security的核心在于其过滤器链,它拦截HTTP请求并应用安全策略。`FilterSecurityInterceptor`是其中的关键组件,负责根据配置的访问规则对请求进行处理。 4. **会话管理**:Spring ...

    一个比较好的spring security实例

    - Spring Security可与OAuth2结合,提供第三方服务的登录和API访问控制。 9. **国际化支持**: - 提供多语言登录提示信息,通过`MessageSource`接口实现。 在"mysecurity"压缩包中的项目,我们可以看到这些概念...

    Spring Security3

    - **实现**:扩展Spring Security提供的过滤器,实现特定的安全需求。 - **示例**:IP过滤器用于限制来自特定IP地址的请求。 **高级配置** - **自定义过滤器配置**:可以针对特定场景定制过滤器的行为,如IP地址白...

    Spring Security 3 与 CAS单点登录配置-Server

    标题 "Spring Security 3 与 CAS 单点登录配置 - Server" 涉及到的是在企业级应用中实现安全访问控制的重要技术。Spring Security 是一个强大的和高度可定制的安全框架,用于保护基于 Java 的 Web 应用程序。而 CAS...

    单点登录实现 Spring_security+CAS

    同时,配置CAS过滤器以处理用户的身份验证请求。 4. **Spring Security与CAS集成**:利用`CasAuthenticationProvider`作为认证提供者,将CAS的验证结果转换为Spring Security的`Authentication`对象。此外,还需要...

Global site tag (gtag.js) - Google Analytics