使用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);
}
}
}
}
分享到:
相关推荐
本项目聚焦于如何在Spring Boot应用中集成Spring Security进行登录验证和权限拦截。 1. **Spring Security简介** Spring Security是一个全面的Java安全框架,它提供了身份验证、授权、CSRF防护、会话管理等核心...
2. **配置登录页面**:Spring Security 默认提供 `/login` 页面,也可以自定义登录界面。 3. **处理登录请求**:在配置类中,通过 `http.formLogin()` 设置登录行为,如登录成功后的重定向等。 4. **处理未授权和...
当用户发起请求时,SpringSecurity会对请求进行拦截,判断是否已登录以及是否有足够的权限。如果请求被授权,SpringBoot后端将处理业务逻辑,如查询、更新人事信息,然后返回响应数据给Vue前端展示。反之,若请求未...
当一个Ajax请求被发送时,它会被Spring Security的过滤链所拦截,遵循相同的认证和授权流程。为了区分Ajax和非Ajax请求,我们可以使用`@Secured`或`@PreAuthorize`注解,或者自定义访问决策管理器。 3. **配置Ajax...
这个压缩包包含的项目"SpringMVCSecurity-master"很可能是用来演示如何配置和使用Spring Security来实现自定义登录表单、处理无效凭证、基于角色的访问控制以及自定义访问拒绝错误消息的示例代码。 在Spring ...
在IT领域,构建一个权限管理系统是企业级应用的常见需求,Spring Security、MyBatis和Spring MVC的整合正是实现这一目标的有效方式。这三个组件分别在不同的层面上为系统提供了强大的支持。 Spring Security是一款...
7. **国际化支持**:Spring Security支持多语言环境,可以轻松地为错误消息和其他用户界面元素提供本地化。 在学习Spring Security 2.0.4的过程中,你可以通过实例教材中的例子来实践以下操作: - 创建简单的认证和...
在这个"SpringBoot_SpringSecurity:前后端分离登陆拦截设计"项目中,我们将探讨如何将这两者结合,实现一个高效的登录拦截系统。 首先,SpringBoot的核心是简化Spring应用的创建和管理,它通过内置的Tomcat服务器、...
- 在`spring-security.xml`中配置自定义登录页面的路径。 - **示例代码**: 配置`<form-login>`元素。 - **4.3 登陆页面中的参数配置** - 定义登录表单提交时所需的参数名称和URL。 - **示例代码**: 在`...
SpringBoot_demo是一个包含Spring Boot、Vue.js和Element Plus框架实现的Web登录页面示例项目。这个项目展示了如何将这三个技术栈结合,构建一个完整的前端到后端的应用。下面将详细介绍这些关键技术及其在登录页面...
3. Spring Security的配置,包括定义访问规则、登录页面、认证和授权策略等。 4. 如何处理HTTP请求和响应,包括使用ModelAndView、Model、ResponseBody等。 5. 如何使用Spring的事务管理,确保数据操作的一致性和...
- **实现自定义登录页面**:介绍如何创建一个符合项目设计风格的登录界面。 - **修改配置文件**:更新Spring Security配置以支持自定义登录页面。 - **登录页面中的参数配置**:设置登录表单所需的参数,如用户名和...
Spring Security通过`@PreAuthorize`和`@PostAuthorize`注解实现基于表达式的访问控制,或者使用`AccessDecisionManager`和`AuthorizationManager`进行更复杂的策略配置。 6. **记住我功能** Spring Security支持...
这是一个基于Spring框架全家桶开发的小型登录项目,涵盖了Spring、SpringMVC、SpringSecurity和Thymeleaf四个核心组件。让我们逐一深入理解这些技术及其在项目中的应用。 首先,Spring是一个开源的应用框架,也是...
在用户成功登录后,服务器会返回一个会话标识(如JWT),前端保存此标识并在后续请求中携带。后端通过这个标识来识别用户并检查其权限。 4. **ExtJS的Ajax请求和数据绑定** ExtJS的Ajax请求(如`Ext.Ajax.request`...
此外,还可以通过Spring Security或Apache Shiro等框架实现权限控制和会话管理,确保只有合法用户可以访问系统。 7. **测试**:在项目中,单元测试和集成测试是非常重要的,可以使用JUnit、Mockito等工具对服务层和...
- **OAuth2支持**:Spring Security可以与其他OAuth2服务器集成,实现单点登录(Single Sign-On, SSO)。 6. **异常处理** 当用户尝试访问受保护的资源但未通过认证或授权时,Spring Security会抛出相应的异常。...
在登录成功后,Spring Security可以根据用户的角色和权限来控制他们能访问的资源。这可以通过定义访问控制规则(如`@PreAuthorize`或`@Secured`注解)和角色(如ROLE_USER, ROLE_ADMIN)实现。 7. **自定义登录...
这是一个基于Spring Boot、Spring Security和Thymeleaf技术栈构建的新冠疫情管理系统的设计与实现项目,适合于毕业设计或深入理解这三大框架在实际项目中的应用。以下是对该项目中涉及的关键知识点的详细说明: 1. ...