`
gtbald
  • 浏览: 20128 次
文章分类
社区版块
存档分类
最新评论

SpringSecurity实现多登录成功页面和登录成功返回被拦截界面

    博客分类:
  • JAVA
阅读更多

使用SrpingSceurity作为认证和授权的安全框架可以省下很多基础工作.

具体可以参考SpringSecurity,这里不多说了.主要是记录一下使用中碰到的问题.

 

问题1

项目有不同客户端需要不同的返回界面,比如Android的登录返回json格式数据.网页登录跳转到登录成功页面.

SpringSecurity的默认配置是做不到这点的.以下是配置登录成功页面的地方.

 

 

<s:form-login login-page="/login.action" default-target-url="/loginsuccess.jsp" authentication-failure-url="/login.action?error=true" />

 

 这里如果loginsuccess.jsp页面是登录成功页,那么Android的登录就不好返回json格式了.

 

解决方法

使用AuthenticationSuccessHandler

 

----------------示例见下----------------

1.定制自己的AuthenticationSuccessHandler类,实现AuthenticationSuccessHandler接口

 

package com.gt.util;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;

public class MyAuthenticationSuccessHandler implements
		AuthenticationSuccessHandler {

	@Override
	public void onAuthenticationSuccess(HttpServletRequest request,
			HttpServletResponse response, Authentication auth)
			throws IOException, ServletException {		
		String f = request.getParameter("f");
		if (StringUtils.isNotEmpty(f)) {
			if(f.equals("android")){
				response.setCharacterEncoding("UTF-8");
				response.getWriter().write("登录成功"+LoginUserUtil.getUser());
			}
			
		}else{
			
			request.getRequestDispatcher("/account/user.exp").forward(request, response);
						
		}

	}

}

 

 

2.登录页面中指定f参数.只是示例,可以自己根据业务定制.

 

3.修改配置文件

增加authentication-success-handler-ref="expaiSuccessHandler"

去掉default-target-url="/loginsuccess.jsp"

 

<s:form-login login-page="/login.exp"
			authentication-success-handler-ref="expaiSuccessHandler"
			authentication-failure-url="/login.exp?error=true" />

 

官方文档介绍

 Attribute : authentication-success-handler-ref

Reference to an AuthenticationSuccessHandler bean which should be used to handle a successful 

 authentication request. Should not be used in combination with default-target-url (or always-use-

 default-target-url) as the implementation should always deal with navigation to the subsequent 

 destination

 

4.修改配置文件,增加bean定义

 

<!-- 登录成功处理器 -->
	<bean id="expaiSuccessHandler" class="com.gt.util.MyAuthenticationSuccessHandler">
	</bean>

---------------------------问题1end--------------------- 

 

 

问题2

登录后返回拦截前的界面

 

思路

在拦截后,进入登录页面前,把被拦截地址放入session中.登录成功从session取出被拦截地址并且跳转.

 

-------------代码示例-----------

1.增加MyLoginUrlAuthenticationEntryPoint 继承 LoginUrlAuthenticationEntryPoint

 

package com.gt.util;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
import org.springframework.security.web.util.RedirectUrlBuilder;

public class MyLoginUrlAuthenticationEntryPoint extends
		LoginUrlAuthenticationEntryPoint {

	public void commence(HttpServletRequest request,
			HttpServletResponse response, AuthenticationException authException)
			throws IOException, ServletException {
		String returnUrl = buildHttpReturnUrlForRequest(request);
		request.getSession().setAttribute("ru", returnUrl);
		super.commence(request, response, authException);
	}

	protected String buildHttpReturnUrlForRequest(HttpServletRequest request)
			throws IOException, ServletException {


		RedirectUrlBuilder urlBuilder = new RedirectUrlBuilder();
		urlBuilder.setScheme("http");
		urlBuilder.setServerName(request.getServerName());
		urlBuilder.setPort(request.getServerPort());
		urlBuilder.setContextPath(request.getContextPath());
		urlBuilder.setServletPath(request.getServletPath());
		urlBuilder.setPathInfo(request.getPathInfo());
		urlBuilder.setQuery(request.getQueryString());

		return urlBuilder.getUrl();
	}

}

 

 

2.修改配置文件,增加引用

 

<s:http auto-config="true" use-expressions="true"
		entry-point-ref="loginUrlAuthenticationEntryPoint">

 

 

 

 

<bean id="loginUrlAuthenticationEntryPoint"
		class="com.gt.util.MyLoginUrlAuthenticationEntryPoint">
		<property name="useForward" value="true" />
		<property name="loginFormUrl" value="/login.exp" />
	</bean>

 

3.修改MyAuthenticationSuccessHandler,增加获取被拦截地址并且跳转代码

 

package com.gt.util;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;

public class MyAuthenticationSuccessHandler implements
		AuthenticationSuccessHandler {

	@Override
	public void onAuthenticationSuccess(HttpServletRequest request,
			HttpServletResponse response, Authentication auth)
			throws IOException, ServletException {		
		String f = request.getParameter("f");
		if (StringUtils.isNotEmpty(f)) {
			if(f.equals("android")){
				response.setCharacterEncoding("UTF-8");
				response.getWriter().write("登录成功"+LoginUserUtil.getUser());
			}
			
		}else{
			String ru = (String)request.getSession().getAttribute("ru");
			request.getSession().removeAttribute("ru");
			if(StringUtils.isNotEmpty(ru)){
				response.sendRedirect(ru);
				//request.getRequestDispatcher(ru).forward(request, response);
			}else{
				request.getRequestDispatcher("/account/user.exp").forward(request, response);
			}
			
		}

	}

}

 

 

 

0
0
分享到:
评论
1 楼 cocopig 2013-01-19  
楼主我是照你的配置方式去配置的,刚开始能成功返回登录前被拦截的页面,可是现在又不成功了。断点发现没有执行MyLoginUrlAuthenticationEntryPoint 类,这不知道是怎么回事

相关推荐

    springsecurity+springspoot登录验证拦截

    本项目聚焦于如何在Spring Boot应用中集成Spring Security进行登录验证和权限拦截。 1. **Spring Security简介** Spring Security是一个全面的Java安全框架,它提供了身份验证、授权、CSRF防护、会话管理等核心...

    springsecurity入门实例

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

    springboot项目——基于springSecurity实现的前后端分离的企业级人事管理系统

    当用户发起请求时,SpringSecurity会对请求进行拦截,判断是否已登录以及是否有足够的权限。如果请求被授权,SpringBoot后端将处理业务逻辑,如查询、更新人事信息,然后返回响应数据给Vue前端展示。反之,若请求未...

    spring security ajax请求与html共存

    当一个Ajax请求被发送时,它会被Spring Security的过滤链所拦截,遵循相同的认证和授权流程。为了区分Ajax和非Ajax请求,我们可以使用`@Secured`或`@PreAuthorize`注解,或者自定义访问决策管理器。 3. **配置Ajax...

    spring security、 mybatis、 spring mvc 整合权限管理系统

    在IT领域,构建一个权限管理系统是企业级应用的常见需求,Spring Security、MyBatis和Spring MVC的整合正是实现这一目标的有效方式。这三个组件分别在不同的层面上为系统提供了强大的支持。 Spring Security是一款...

    spring Security 2.0.4中文菜鸟实例教材

    7. **国际化支持**:Spring Security支持多语言环境,可以轻松地为错误消息和其他用户界面元素提供本地化。 在学习Spring Security 2.0.4的过程中,你可以通过实例教材中的例子来实践以下操作: - 创建简单的认证和...

    SpringBoot_SpringSecurity:前后端分离登陆拦截设计

    在这个"SpringBoot_SpringSecurity:前后端分离登陆拦截设计"项目中,我们将探讨如何将这两者结合,实现一个高效的登录拦截系统。 首先,SpringBoot的核心是简化Spring应用的创建和管理,它通过内置的Tomcat服务器、...

    Spring Security3技术手册

    - 在`spring-security.xml`中配置自定义登录页面的路径。 - **示例代码**: 配置`&lt;form-login&gt;`元素。 - **4.3 登陆页面中的参数配置** - 定义登录表单提交时所需的参数名称和URL。 - **示例代码**: 在`...

    Spring4 整合SpringMVC, Hibernate5, SpringSecurity4.2 源码

    3. Spring Security的配置,包括定义访问规则、登录页面、认证和授权策略等。 4. 如何处理HTTP请求和响应,包括使用ModelAndView、Model、ResponseBody等。 5. 如何使用Spring的事务管理,确保数据操作的一致性和...

    spring security2 安全手册(牛人写的)

    - **实现自定义登录页面**:介绍如何创建一个符合项目设计风格的登录界面。 - **修改配置文件**:更新Spring Security配置以支持自定义登录页面。 - **登录页面中的参数配置**:设置登录表单所需的参数,如用户名和...

    Spring MVC Security-添加自定义登录表单,显示无效凭据、基于角色的访问、自定义访问被拒绝的错误消息.zip

    这个压缩包包含的项目"SpringMVCSecurity-master"很可能是用来演示如何配置和使用Spring Security来实现自定义登录表单、处理无效凭证、基于角色的访问控制以及自定义访问拒绝错误消息的示例代码。 在Spring ...

    spring实现登录注册(尚未彻底完善)

    Spring Security通过`@PreAuthorize`和`@PostAuthorize`注解实现基于表达式的访问控制,或者使用`AccessDecisionManager`和`AuthorizationManager`进行更复杂的策略配置。 6. **记住我功能** Spring Security支持...

    史上最全springboot+vue3+element-plus代码实现web登录页面(附件有代码)

    SpringBoot_demo是一个包含Spring Boot、Vue.js和Element Plus框架实现的Web登录页面示例项目。这个项目展示了如何将这三个技术栈结合,构建一个完整的前端到后端的应用。下面将详细介绍这些关键技术及其在登录页面...

    Spirng+SpringMVC+SpringSecurity+Thymeleaf+基于Java配置的登录小项目.zip

    这是一个基于Spring框架全家桶开发的小型登录项目,涵盖了Spring、SpringMVC、SpringSecurity和Thymeleaf四个核心组件。让我们逐一深入理解这些技术及其在项目中的应用。 首先,Spring是一个开源的应用框架,也是...

    extjs实现权限拦截

    在用户成功登录后,服务器会返回一个会话标识(如JWT),前端保存此标识并在后续请求中携带。后端通过这个标识来识别用户并检查其权限。 4. **ExtJS的Ajax请求和数据绑定** ExtJS的Ajax请求(如`Ext.Ajax.request`...

    Spring+SpringMVC+MyBatis整合工程完整实例及实现用户登录功能

    此外,还可以通过Spring Security或Apache Shiro等框架实现权限控制和会话管理,确保只有合法用户可以访问系统。 7. **测试**:在项目中,单元测试和集成测试是非常重要的,可以使用JUnit、Mockito等工具对服务层和...

    spring-boot-security

    - **OAuth2支持**:Spring Security可以与其他OAuth2服务器集成,实现单点登录(Single Sign-On, SSO)。 6. **异常处理** 当用户尝试访问受保护的资源但未通过认证或授权时,Spring Security会抛出相应的异常。...

    security_certification.rar

    在登录成功后,Spring Security可以根据用户的角色和权限来控制他们能访问的资源。这可以通过定义访问控制规则(如`@PreAuthorize`或`@Secured`注解)和角色(如ROLE_USER, ROLE_ADMIN)实现。 7. **自定义登录...

    基于SpringBoot+SpringSecurity+Thymeleaf新冠疫情管理系统设计毕业设计.zip

    这是一个基于Spring Boot、Spring Security和Thymeleaf技术栈构建的新冠疫情管理系统的设计与实现项目,适合于毕业设计或深入理解这三大框架在实际项目中的应用。以下是对该项目中涉及的关键知识点的详细说明: 1. ...

Global site tag (gtag.js) - Google Analytics