`
Wind_ZhongGang
  • 浏览: 261559 次
  • 性别: 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 Security 3.pdf

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

    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的工作原理...

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

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

    springsecurity学习笔记

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

    spring spring security2.5 jar

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

    一个比较好的spring security实例

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

    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`对象。此外,还需要...

    浅析Spring Security登录验证流程

    SpringSecurity提供了多种登录认证的方式,由多种Filter过滤器来实现,比如:BasicAuthenticationFilter实现的是HttpBasic模式的登录认证,UsernamePasswordAuthenticationFilter实现用户名密码的登录认证,...

    spring security用户权限项目

    3. **过滤器链(Filter Chain)**:Spring Security 使用一系列过滤器处理请求,如 `SecurityContextPersistenceFilter` 保存和恢复安全上下文,`UsernamePasswordAuthenticationFilter` 处理登录请求。理解过滤器链...

    SpringSecurity 3配置文件

    通过调整配置,我们可以构建出满足各种安全需求的应用,从简单的登录验证到复杂的访问控制策略,Spring Security都能提供强大支持。在实际项目中,应根据项目规模和安全要求,适当地调整和优化配置,确保应用的安全...

    Spring Security3 简单demo

    在压缩包文件"SpringSecurity3"中,可能包含了以下内容: - `spring-security.xml`:这是主要的配置文件,包含了上述提到的所有配置。 - `web.xml`:可能包含了Spring Security过滤器链的配置,以便在Web应用启动时...

    spring security + spring oauth2 +spring mvc SSO单点登录需要的最小jar包集合

    Spring Security的核心组件包括过滤器链、安全上下文和访问决策管理器等,它们协同工作以确保只有经过适当授权的用户可以访问受保护的资源。 接着,Spring OAuth2 是基于OAuth 2.0协议的开源库,主要用于处理授权...

Global site tag (gtag.js) - Google Analytics