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

Spring Security 3多用户登录实现之二 多登录界面展示

 
阅读更多

      接前讲,首先针对一个多种用户类型的登录需求,需要先实现多种用户类型的登录界面的展示,Spring Security提供了这样一个接口来帮助我们实现多种用户类型的登录界面的展示,这个接口就是AuthenticationEntryPoint, 实现这样一个接口,我们就可以随心所欲的控制登录界面的展示了,当我们访问一个受权限的资源,而当前又没有权限访问时,Spring Security就会将处理导向这个接口的实现。针对前讲我所提到的需求,在这里我将实现前台用户和后台用户登录界面的展示,先来看看我的源码实现吧,在这里为了实现多用户类型的登录,很多场景我都需要根据相应的请求参数或地址来判断我需要导向哪个URL地址,我在这里特实现了一个共用的接口和类,接口名为DirectUrlResolver。

 

 

 

package com.template.security.shared;

import javax.servlet.http.HttpServletRequest;

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

    boolean support(HttpServletRequest request);

    String directUrl();
}
 

 

package com.template.security.shared;

import javax.servlet.http.HttpServletRequest;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 12-11-9
 * Time: 下午7:12
 */
public abstract class AbstractDirectUrlResolver implements DirectUrlResolver {
    protected String pattern;
    protected String directUrl;

    @Override
    public abstract boolean support(HttpServletRequest request);

    @Override
    public String directUrl() {
        return this.directUrl;
    }

    public void setPattern(String pattern) {
        this.pattern = pattern;
    }

    public void setDirectUrl(String directUrl) {
        this.directUrl = directUrl;
    }
}

 

package com.template.security.shared;

import com.template.utils.StringUtils;

import javax.servlet.http.HttpServletRequest;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 12-11-9
 * Time: 下午7:13
 */
public class RequestParameterDirectUrlResolver extends AbstractDirectUrlResolver {
    private String parameterName;

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

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

 

 

 

package com.template.security.shared;

import javax.servlet.http.HttpServletRequest;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 12-11-9
 * Time: 下午7:13
 */
public class RequestUriDirectUrlResolver extends AbstractDirectUrlResolver {

    @Override
    public boolean support(HttpServletRequest request) {
        String requestURI = request.getRequestURI();
        return requestURI.contains(this.pattern);
    }
}

 

     RequestParameterDirectUrlResolver和RequestUriDirectUrlResolver都实现了DirectUrlResolver这样一个接口,前者的实现是根据相应请求中的参数来判断, 而后者的实现是根据相应的请求地址来判断。

 

    现在让我们来看看如何通过实现AuthenticationEntryPoint接口来控制什么时候展示前台登录界面,什么时候展示后台登录界面的吧。

 

 

package com.template.security.login;

import com.template.security.shared.DirectUrlResolver;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;

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: 下午7:40
 */
public class MultipleAuthenticationLoginEntry implements AuthenticationEntryPoint {
    private String defaultLoginUrl;
    private List<DirectUrlResolver> directUrlResolvers = new ArrayList<DirectUrlResolver>();


    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
        for (DirectUrlResolver directUrlResolver : directUrlResolvers) {
            if (directUrlResolver.support(request)) {
                String loginUrl = directUrlResolver.directUrl();
                response.sendRedirect(loginUrl);
                return;
            }
        }

        response.sendRedirect(defaultLoginUrl);
    }

    public void setDefaultLoginUrl(String defaultLoginUrl) {
        this.defaultLoginUrl = defaultLoginUrl;
    }

    public void setDirectUrlResolvers(List<DirectUrlResolver> directUrlResolvers) {
        this.directUrlResolvers = directUrlResolvers;
    }
}

 

     再来看看在Spring配置文件中是如何对相应的登录入口进行配置的吧

 

 

<beans:bean id="multipleAuthenticationLoginEntry"
                class="com.template.security.login.MultipleAuthenticationLoginEntry">
        <beans:property name="defaultLoginUrl" value="/backend/login"/>
        <beans:property name="directUrlResolvers">
            <beans:list>
                <beans:ref bean="backendLoginEntry"/>
                <beans:ref bean="forendLoginEntry"/>
            </beans:list>
        </beans:property>
    </beans:bean>

    <beans:bean id="backendLoginEntry" class="com.template.security.shared.RequestUriDirectUrlResolver">
        <beans:property name="pattern" value="/backend"/>
        <beans:property name="directUrl" value="/backend/login"/>
    </beans:bean>

    <beans:bean id="forendLoginEntry" class="com.template.security.shared.RequestUriDirectUrlResolver">
        <beans:property name="pattern" value="/forend"/>
        <beans:property name="directUrl" value="/forend/login"/>
    </beans:bean>

 

   这里我是根据请求的地址中是否包括backend或forend来判断用户是进行前台登录或后台登录的, 这可以从配置文件中的backendLoginEntry和forendLoginEntry中的pattern属性看出,这个pattern的作用就是判断用户是进行前台登录或后台登录的依据,而directUrl则是我们想要导向的登录界面地址。

分享到:
评论
1 楼 cj123584795 2013-08-05  
        

相关推荐

    spring-security多登录页面配置

    本文将详细介绍如何在Spring Security框架下配置多登录页面,包括前台与后台用户的分开登录界面,以及注销登录后返回到不同的页面等功能。 #### 一、Spring Security简介 Spring Security是Spring家族中的一个子...

    spring-security多个登录页面配置

    本文将详细介绍如何通过Spring Security配置多个登录页面,并为不同类型的用户设置不同的登录逻辑及登出后的返回界面。这不仅有助于提高系统的安全性,还能优化用户体验。 ### Spring Security简介 Spring ...

    Spring_Security_多页面登录配置教程

    ### Spring Security 多...通过本文介绍的方法,你可以轻松地在Spring Security中实现多页面登录功能,从而提高应用程序的安全性和用户体验。希望这些知识点能帮助你在实际开发过程中更好地利用Spring Security框架。

    springSecurity3例子

    - 支持多语言界面,可以根据用户的首选语言显示错误消息和提示信息。 6. **会话管理**: - 可以设置会话超时、限制并发会话以及实现会话固定化策略,防止会话劫持。 7. **细粒度的URL保护**: - 使用`@Secured`...

    springsecurity学习笔记

    在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...

    基于 Spring Boot 3Spring Security 6Vue.js 3 的前后端分离式论坛系统

    在构建基于 Spring Boot 3、Spring Security 6 和 Vue.js 3 的前后端分离式论坛系统时,我们涉及了现代Web开发的多个关键领域。这是一个综合性的项目,旨在利用最新的技术栈来创建一个高效、安全且用户体验良好的...

    spring security用户权限项目

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

    cas 和spring security 单点登录 配置

    4. **登录与注销处理**:Spring Security会自动处理登录和注销请求,但你可能需要自定义登录页面或者实现特定的注销逻辑。 **三、客户端应用的SSO体验** 1. **用户访问**:当用户首次访问受保护的资源时,会被...

    spring-security 官方文档 中文版

    - Spring Security 提供了对国际化(i18n)的支持,使得开发者能够轻松地实现多语言界面。 #### 四、Spring Security 社区 - **4.1 任务跟踪**:开发者可以通过 JIRA 等工具跟踪项目的问题和进展。 - **4.2 成为参与...

    SpringSecurity源码 SpringSecurity jar包 简单的Demo

    3. 实现登录界面,处理用户提交的登录信息。 4. 定义用户凭证(如内存中的UserDetails),并创建相应的`UserDetailsService`。 5. 创建一个安全配置类,扩展`WebSecurityConfigurerAdapter`,覆盖必要的方法来定制...

    springsecurity前端素材.zip

    在本“springsecurity前端素材”中,我们有两个主要的文件夹:templates和static,它们分别代表了前端展示层的不同方面。 **templates** 文件夹通常包含了应用的HTML模板文件,这些文件被用于构建用户界面。在...

    springsecurity入门实例

    2. **配置登录页面**:Spring Security 默认提供 `/login` 页面,也可以自定义登录界面。 3. **处理登录请求**:在配置类中,通过 `http.formLogin()` 设置登录行为,如登录成功后的重定向等。 4. **处理未授权和...

    SpringBoot+SpringSecurity+thymeleaf基础代码

    5. Thymeleaf模板:学习如何创建和使用Thymeleaf模板,结合Spring Security实现动态展示登录状态、权限提示等。 6. 错误页面处理:配置Spring Boot的错误页面,处理未授权、未登录等异常情况。 7. 登录和注销流程:...

    springSecurity3.x

    9. **Web表单登录**:Spring Security提供了一个默认的登录页面和登录处理控制器,但也可以自定义登录界面和流程。 10. **OAuth2集成**:Spring Security 3.x版本开始支持OAuth2,允许应用与其他服务进行安全的API...

    Spring Security3.1实践

    - **国际化支持**:Spring Security支持多语言界面,提供国际化配置。 6. **源码解析** - 理解Spring Security的源码有助于深入定制和优化安全策略。 - 关键类如`AbstractAuthenticationProcessingFilter`、`...

    spring boot + 漂亮的登陆界面

    Spring Security 是一个强大的安全框架,它可以轻松地实现用户认证和授权。在 `src/main/java/com/example/yourapp/config` 目录下创建一个名为 `SecurityConfig.java` 的类,并实现相关配置: ```java @...

    Spring Security集成CAS客户端实例

    本实例旨在展示如何将Spring Security与CAS结合,实现一个高效的单点登录(Single Sign-On,SSO)解决方案。下面,我们将深入探讨这个集成过程。 首先,Spring Security是Spring框架的一部分,专门用于应用程序的...

    基于 Java 17 + Spring Boot 3 + Spring Security 6 + Vue 3 + E.zip

    开发过程中,开发者可以利用Spring Boot的自动配置和Spring Security的灵活性来实现复杂的业务逻辑和权限控制,同时Vue 3的组件化特性简化了前端开发。 在实际项目中,开发者还需要考虑数据库(如MySQL、PostgreSQL...

Global site tag (gtag.js) - Google Analytics