Spring Security多登录口实现

ss3ex中配置的Spring Security一直是单登陆口,现改成多登录口,坚持少写代码的原则,但是不管怎么样,必须要解决以下几个问题:
1、用户未登录:访问权限页面,访问非权限页面
2、用户登录:访问权限页面(权限不够)
3、密码错误返回页面
4、注销页面
一个个问题来解决,第一个问题,用户未登录时访问访问非权限页面,直接就过了。麻烦的就是访问有权限的页面,因为Spring Security会使用AuthenticationEntryPoint在未登录用户访问被保护资源时自动跳转到登录页面,所以我们这里需要的就是扩展AuthenticaitonEntryPoint。
修改spring_security.xml文件:
<http auto-config="true" access-denied-page="/common/403.htm"
entry-point-ref="loginPageEntryPoint">
<intercept-url pattern="/login.**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<intercept-url pattern="/loginfont.**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
……
<beans:bean id="loginPageEntryPoint" class="com.security.resource.LoginPageEntryPoint">
<beans:property name="loginPageStrategy" ref="urlMappingLoginPageStrategy" />
</beans:bean>
<beans:bean id="urlMappingLoginPageStrategy"
class="com.security.resource.UrlMappingLoginPageStrategy" />

LoginPageEntryPoint.java文件:
package com.security.resource;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.security.AuthenticationException;
import org.springframework.security.ui.AuthenticationEntryPoint;
import org.springframework.util.Assert;


public class LoginPageEntryPoint implements AuthenticationEntryPoint,
InitializingBean {
private LoginPageStrategy loginPageStrategy;

public void afterPropertiesSet() throws Exception {
Assert.notNull(loginPageStrategy,
"loginPageStrategy must be specified");
}

public void commence(ServletRequest request, ServletResponse response,
AuthenticationException authException)
throws IOException, ServletException {
loginPageStrategy.process((HttpServletRequest) request,
(HttpServletResponse) response);
}

public void setLoginPageStrategy(LoginPageStrategy loginPageStrategy) {
this.loginPageStrategy = loginPageStrategy;
}
}
LoginPageStrategy.java 接口文件:
package com.security.resource;

import java.io.IOException;

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


public interface LoginPageStrategy {
void process(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException;
}
UrlMappingLoginPageStrategy.java文件:
package com.security.resource;

import java.io.IOException;

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


public class UrlMappingLoginPageStrategy implements LoginPageStrategy {
public void process(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
String targetUrl = null;
String uri = request.getRequestURI();

if (uri.indexOf("system") != -1) {
targetUrl = "/login.jsp";
} else {
targetUrl = "/loginfont.jsp";
}

targetUrl = request.getContextPath() + targetUrl;
response.sendRedirect(targetUrl);
}
}
备注:别忘了在login.jsp同目录下复制一个jsp文件,取名叫loginfont.jsp。这2个文件代表着2个不同的登录口,表单提交的地址都是action="${base}/j_spring_security_check"。另外,因为多了一个登陆页面,他的权限也要放开,见上面修改的spring_security.xml文件。

第二个问题的解决方案有2个,分别是扩展AuthenticationProcessFilter,拦截403错误,还是根据url来判断跳转到不同的页面,这个方案我写了个类,开始抱着一定要实现的目的,由于逻辑上很多地方分散了,不好全部集中处理,后来觉得很麻烦,于是就放弃了。第二个方案相对来说,简单些,就是在用户登录时,往session中写进一个状态,如果不用session就用ThreadLocal,然后修改access-denied-page="/common/403.htm" 把这个页面改成一个action或者jsp的地址,在其中提取session中的值进行判断,跳转到不同的无权限错误页面。用户登录时写session有2个方案,一是,直接在ss3ex 中我配置的密码过滤器中操作(这个比较简单)。还有一个就是lingo介绍的自定义过滤器,他实现的步骤是:
添加spring_security.xml 文件
<!-- 自定义过滤器,刚开始由于没有配置authenticationFailureUrl属性,导致用户密码错误出错后,跳转页面不正常-->
<beans:bean id="loginFilter" class="com.security.resource.LoginFilter">
<!-- 放置在AUTHENTICATION_PROCESSING_FILTER的前面-->
<custom-filter before="AUTHENTICATION_PROCESSING_FILTER" />
<!-- 认证-->
<beans:property name="authenticationManager" ref="authenticationManager" />
<!-- 认证错误页面-->
<beans:property name="authenticationFailureUrl" value="/login.jsp?error=1" />
<!-- 认证成功页面,必须的-->
<beans:property name="defaultTargetUrl" value="/demo/success.shtml" />
</beans:bean>
LoginFilter.java 文件:
package com.security.resource;

import javax.servlet.http.HttpServletRequest;
import org.springframework.security.Authentication;
import org.springframework.security.AuthenticationException;
import org.springframework.security.ui.webapp.AuthenticationProcessingFilter;

import com.utils.FakeSession;

public class LoginFilter extends AuthenticationProcessingFilter {

public Authentication attemptAuthentication(HttpServletRequest request)
throws AuthenticationException {
Authentication authentication = super.attemptAuthentication(request);
//状态, admin表示后台,font表示前台
String status = null;
String uri = request.getRequestURI();
if (uri.indexOf("system") != -1) {
status = "admin";
} else {
status = "font";
}
FakeSession.messageSegment.set(status);
return authentication;
}
}
FakeSession类(仿session)见我博客的另一篇文章。


第三个问题的解决方案,思路已经在第二个问题中解决了
<!-- 认证错误页面-->
<beans:property name="authenticationFailureUrl" value="/login.jsp?error=1" />

不过这里要修改下login.jsp,按照第二个问题的思路,写个判断的条件,根据ThreadLocal中status的状态跳转到不同的页面。

第四个问题的解决方案,注销页面,<logout logout-success-url="/login.jsp" invalidate-session="true" /> 也是修改这个页面,已经在第三个问题中解决了。

末:感谢狂人和lingo,提供的security的帮助,感谢小鸟提供的ThreadLocal。

老是有人问,再说详细点,补充如下(源代码在ss3ex中):
spring security2的流程
Spring Security会使用AuthenticationEntryPoint在未登录用户访问被保护资源时自动跳转到登录页面,自定义过滤器扩展AuthenticationProcessingFilter过滤器实现登录后,跳转页面前的后续操作,比如可以实现在跳转页面前往session中写入些内容。
Spring Security2多登录口实现
1、前后台登录页面;扩展AuthenticationEntryPoint过滤器
2、前后台认证成功页面;自定义过滤器扩展AuthenticationProcessingFilter过滤器
3、前后台认证失败页面;自定义过滤器扩展AuthenticationProcessingFilter过滤器
4、前后台无权限页面; access-denied-page
5、前后台注销返回页面。配置<logout logout-success-url="/login.jsp" invalidate-session="true" />标签
按照以上思路,可以实现无数个登录口。
SpringSecurity解决多表登录问题 阅读详情

相关推荐

SpringSecurity多表,多端账户登录

基于SpringSecurity实现多表用户完全解耦认证,可无限扩展用户类型

路漫漫其修远兮,吾将上下而求索 2526

SpringSecurity自定义多重登录方式

前后分离项目,SpringSecurity自定义多重登录方式,通过自定义AuthenticationProvider实现,同时自定义过滤器进行登录验证

头发茂密的假程序猿 7056

spring security 实现微信登录

介绍 上一章讲解了如何用QQ实现登录,这一回讲解的是用微信实现登录。 实现功能 实现微信登录。 开发步骤 引入jar包 jar包的引入和QQ引入的jar包一致。 微信实体信息 /** * @author lvhaibao * @description * @date 2019/1/4 0004 9:46 */ @Data public class WeixinUserInfo { ...

一个正在崛起的小码农 1万+

不同系统间如何调用接口_Spring Security 实战干货:如何实现不同的接口不同的安全策略...

1. 前言 欢迎阅读 Spring Security 实战干货 系列文章 。最近有开发小伙伴提了一个有趣的问题。他正在做一个项目,涉及两种风格,一种是给小程序出接口,安全上使用无状态的JWT Token;另一种是管理后台使用的是Freemarker,也就是前后端不分离的Session机制。用Spring Security该怎么办? 2. 解决方案 我们可以通过多次继承WebSecurityCon...

weixin_39936388的博客 1049

关于spring-security登录后重定向至拦截前访问的url的实现原理

首先我们来看下我们整个流程图 这就是我自己摸索出来的关于整个访问拦截登录重定向的流程图 其中3,6,7步是对拦截前访问的request的处理 接下来是对以上几个步骤中关键代码的分析 1. 首先我们先了解下关于 FilterSecurityIntercepto所在的位置 我们看到他在最后一位从这个拦截器的下面代码: // Attempt a

ZY_cookie的专栏 2万+

Spring Security + Jwt实现单点登录

Spring Security 功能强大的处理**认证**和**授权**的框架 添加框架后,在不添加任何配置时,访问任何页面都会重定向到框架自带的login页面 框架提供了默认的用户名:``user``与密码:启动时生成的``UUID``

weixin_72718065的博客 1959

Spring Security实现短信登录

文章目录一、理论说明1.1 用户名密码登录逻辑1.2 短信验证码登录逻辑二、代码实战2.1 SmsAuthenticationToken2.2 SmsAuthenticationFilter2.3 SmsAuthenticationProviderhardcode的方式来模拟手机号查询用户信息2.4 成功与失败处理逻辑2.5 SmsCodeAuthenticationSecurityConfig将...

weixin_38927257的博客 3237

spring-boot:使用spring security实现用户登录注册(一)

项目地址:https://github.com/lizhibin205/simple_web_v2 一、数据库表 CREATE TABLE `users` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID', `name` varchar(45) COLLATE utf8mb4_unicode_ci ...

zhibin的程序日记 9148

Spring Boot 2结合Spring security + JWT实现微信小程序登录

项目源码:https://gitee.com/tanwubo/jwt-spring-security-demo

qq_22606825的博客 1万+

Springboot+Spring-Security+JWT 实现用户登录和权限认证

如今,互联网项目对于安全的要求越来越严格,这就是对后端开发提出了更多的要求,目前比较成熟的几种大家比较熟悉的模式,像RBAC 基于角色权限的验证,shiro框架专门用于处理权限方面的,另一个比较流行的后端框架是Spring-Security,该框架提供了一整套比较成熟,也很完整的机制用于处理各类场景下的可以基于权限,资源路径,以及授权方面的解决方案,部分模块支持定制化,而且在和oauth2.0进...

congge 27万+

spring-security多个登录页面配置

spring-security多个登录页面配置,分开了前台登录页面和后台登录页面登录,还有注销返回的不同的界面。

SpringBoot整合Spring Security+JWT实现用户注册登录

最近在做一个自己的项目,前后端分离的项目,于是整合了一下Spring Security和JWT来实现后端系统的用户登录,自己以前没有使用过Spring Security所以这次踩坑之后记录下来。 该文较长,请耐心阅读,需要整合这部分的可以给到你一些帮助。 一、整合JWT 1.1 pom包 <!-- jwt依赖 --> <dependency> <groupId>io.jsonwebtoken</gro.

qq_40126996的博客 7875

进芯AVP28335烧录避坑全记录:CCS、Uniflash、C2Prog、SDFlash四大工具配置详解

本文详细解析了进芯AVP28335芯片在烧录过程中遇到的常见问题及解决方案,涵盖CCS、Uniflash、C2Prog和SDFlash四大工具的配置要点。针对国产器件AVP28335的特殊需求,提供了从开发环境准备到烧录验证的全流程指南,帮助开发者高效完成程序烧录,避免常见陷阱。

weixin_30836759的博客 591

清晰搞懂Spring Security的登录认证

在简单学习完成Redis之后,又进行了SpringSecurity的学习,这里学习的资源为三更草堂的SpringSecurity框架教程,讲得感觉还不错,推荐😁。这里主要是对学习过程进行一个记录和总结,参考的仍然是三更草堂的笔记,但中间加上了自己的一些理解和看法以及一些遇到的问题总结,如果哪里有问题还请各位指点指点😻。

陈宝子的博客 9821

本地大模型部署实战:LM Studio与Ollama的易用性与性能深度评测

本文对两款主流本地大模型部署工具LM Studio和Ollama进行了深度评测。LM Studio凭借图形化界面和内置模型库,为新手提供了开箱即用的便捷体验,并支持OpenAI兼容API,易于生态集成。Ollama则以命令行驱动,轻量高效,凭借其原生API和Modelfile自定义能力,在自动化集成和性能方面表现突出。文章从易用性、模型生态、性能及扩展性多维度对比,帮助用户根据自身技术背景和使用场景做出最佳选择。

weixin_29039773的博客 528

智能车轮腿组‘定点排雷’科目全解析:从雷区识别到姿态控制

本文深入解析了智能车竞赛轮腿穿越组‘定点排雷’科目的核心技术。从构建鲁棒的视觉识别系统,到融合编码器与IMU进行厘米级定位,再到实现框内高精度旋转的姿态控制,提供了一套完整的从感知到执行的闭环技术方案,助力参赛队伍攻克这一高难度科目。

weixin_29161719的博客 640

spring security 单点登录 简单实现

1、基本概念 SSO (Single Sign On) SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。 spring security Spring Security 是一个安...

zenggenihao的专栏 13万+

(2)NPW(监控片)【中】---业务场景精讲

自己在日常工作当中,由于非产线人员出生,对NPW的知识一直一知半解,业务场景认识的不够透彻,做系统的时候很难理解甲方的NPW业务应用,特收集了不少关于NPW的一些业务场景,下面都是一些摘抄,大家关注我标红标粗的部分,

阿拉伯梳子的专栏 1589

Spring-boot + Spring-Security 登录认证原理与多认证方式的实现

Spring-boot + Spring-Security 登录认证原理1、概述2、主要成员3、原理4、总结 1、概述 知道Spring-Security认证原理,为多种登录方式,多种认证做准备。 2、主要成员 Spring-Security认证主要组成成员: 1)认证过滤器抽象类 AbstractAuthenticationProcessingFilter UsernamePasswordAuthenticationFilter为其默认实现,拦截登录路径。 2)封装的认证实体抽象类 AbstractAut

weixin_37558119的博客 2476

【AI大模型应用开发】教你用AI轻松将你的知识库变为知识图谱(附完整代码,直接运行)

本文我们来介绍如何使用AI,将自己的知识库自动转换为知识图谱,并进行可视化展示。

同学小张的博客 3928

1553B总线介绍及其硬件方案设计

军用1553B总线 1.简介 简单介绍可参考(https://blog.youkuaiyun.com/ScilogyHunter/article/details/108444231)博主写的很详细。 1553B总线是MIL-STD-1553总线的简称,其中B就是BUS,MIL-STD-1553B总线是飞机内部时分制命令/响应式多路复用数据总线。1553B数据总线标准是20世纪70年代由美国公布的一种串行多路数据总线标准。1553B总线能挂31个远置终端,1553B总线采用指令/响应型通信协议,它有三种终端类型: BC:

小幽余生不加糖 1万+

Spring-Security 实现前后端分离登录

简述 使用Spring-Security来实现登录,但是搜到的都是通过模板引擎的方式来实现的,也就是必须通过login.html页面来登录。考虑到现在架构都是采用的是动静分离的架构,那么登录也需要使用纯Restful Api的方式来实现。 项目demo已经写好: https://github.com/bulingfeng/spring-security-login.git 源码介绍 1、pom文件的引用 <dependency> <groupId>org

qq_34796981的博客 1万+

YOLO11全网首发:CVPR2026 Transformer注意力 | BinaryAttention 1-bit注意力,推理提速100%,超越FlashAttention2

本文改进:BinaryAttention 结合YOLO11的C3k2模块,全网首发创新。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 856

Spring Security之多点登录控制

是否还在为怎么禁止多点登录而烦恼?不妨来参考下SpringSecurity如何实现的吧。相较于其他框架完全自定义实现来说,SpringSecurity提供了开箱即用的多点登录控制哦。

Evan_L的博客 2025

OpenCV实战(1)——OpenCV与图像处理基础

OpenCV 是一个跨平台计算机视觉和机器学习库,实现了图像处理和计算机视觉方面的很多通用算法。本节将介绍 OpenCV 的基础知识,以及如何编译运行 OpenCV 程序,并介绍如何完成最基本的图像处理任务——读取、显示和保存图像。除此之外,鼠标事件和图形绘制也是 OpenCV 计算机视觉项目中常用的基本功能,本节介绍了如何使用这两个重要的 OpenCV 功能。

盼小辉丶的博客 12万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring Security 实现用户名密码登录

Spring Security提供了一个UserDetailsService接口,我们需要实现这个接口的loadUserByUsername方法,用于用户信息的获取,如果存在用户,则把用户的密码获取出来,如果不存在这个用户,直接抛异常。SQL脚本在resouces/db目录下,项目启动后会自动初始化脚本,无需手动执行。以上便完成了所有后端代码的编写,接下来,完成controller和前端页面的编写。显示登录页面,输入用户名密码,点击登录,即可看到效果。准备好建表语句后,完成实体类的编写。

Practitioner 4122

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: 不用session、request传值的另一种解决方案
下一篇: 读取excel文件
iteye_6521
博客等级 码龄8年 0粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值