当前位置: 首页 > news >正文

单点登录及登录相关功能1

登录的面临问题

  • 安全问题,登录面临的安全问题
  • 用户体验,快捷登录如短信登陆等
  • 并发问题 ,用户增加面临很多用户同时登录
  • 移动设备登录
  • 第三方账号登陆,通过其他社交帐号等其他第三方登录
  • 单点登录和统一身份认证,用户需要一次登录访问多个应用程序
  • 法律法规和合规性, 登录后数据加密和隐私政策
  • 可扩展性和灵活性,登录功能不断扩展和升级可能需要支持

定义:什么是单点登录

简称SSO(Single sign-on)

  1. 登录后可以访问该系统的各个应用
  2. 登陆后要存储用户的登陆状态
  3. 登陆后提供令牌和会话标识
  4. 存储已有用户的身份凭证

如何实现和解决上面的问题

spring会出手

  • 安全问题:Spring Security 是一个强大的安全框架,它提供了多种身份验证和授权机制,可以帮助保护登录功能免受各种安全威胁,如密码泄露、SQL 注入、XSS 和 CSRF 攻击。
  • 用户体验问题:Spring 框架提供了丰富的 Web 开发特性,如 Spring MVC 和 Spring WebFlux,可以帮助构建用户友好的登录界面。这些框架提供了灵活的视图解析和模板引擎,允许开发者创建响应式和易于使用的界面。
  • 高并发问题:Spring 提供了一系列工具和技术来处理高并发访问,如 Spring Boot 的自动配置和嵌入式服务器,以及 Spring Cloud 中的微服务架构和负载均衡策略。这些特性有助于构建高性能和可扩展的登录系统。
  • 移动设备适配:Spring Mobile 是一个针对移动设备优化的扩展,它提供了适配不同移动设备屏幕尺寸和操作系统的功能,使得登录功能在移动设备上能够提供良好的用户体验。
    社交登录和第三方登录:Spring Social 是一个用于与社交网络集成的框架,它提供了与微信、QQ、
  • 微博等社交平台登录的功能。Spring Social 简化了与第三方身份提供者的集成过程。
    单点登录和统一身份认证:Spring Security 支持单点登录(SSO)和联合身份验证(Federated Identity),这有助于减少用户在多个应用系统中重复登录的繁琐。Spring Cloud 中的 Spring Cloud OAuth2 提供了构建单点登录系统的解决方案。
  • 法律法规和合规性:Spring 框架本身并没有直接解决法律法规和合规性问题的功能,但是它提供了一个灵活的开发框架,可以在其上构建符合法律法规和合规性要求的应用程序。例如,你可以利用 Spring 的 AOP(面向切面编程)特性来实现数据加密、日志记录和访问控制等功能。
    可扩展性和灵活性:Spring 框架的核心是 IoC(控制反转)和 DI(依赖注入)容器,它允许开发者以松散耦合的方式构建应用程序。这种方式提供了极大的可扩展性和灵活性,使得登录功能可以方便地集成新的认证方式、支持多因素认证或与其他系统进行集成。

认证授权

拦截器实现session认证与授权

1.配置spring session

<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session</artifactId>
</dependency>
  1. 配置session策略
spring.session.store-type=jdbc
spring.session.jdbc.table-name=spring_session
spring.session.jdbc.initialize-schema=embedded
  1. 登陆表单
<form action="/login" method="post"><input type="text" name="username" placeholder="Username" required><input type="password" name="password" placeholder="Password" required><button type="submit">Login</button>
</form>

拦截器
5. 创建拦截器

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class AuthenticationInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 检查Session中是否存在用户名,如果不存在,则重定向到登录页面if (request.getSession().getAttribute("username") == null) {response.sendRedirect("/login");return false;}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 在请求处理之后执行的操作,这里可以添加一些日志记录或者其他处理逻辑}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 在整个请求完成后执行的操作,这里可以进行一些资源清理工作}
}
  1. 注册拦截器
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new AuthenticationInterceptor()).addPathPatterns("/dashboard/**") // 保护需要认证的路径.excludePathPatterns("/login", "/css/**", "/js/**"); // 排除不需要认证的路径}
}
  1. 设置授权拦截器
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class AuthorizationInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 假设我们通过Session中的"role"属性来检查用户的角色String role = (String) request.getSession().getAttribute("role");if (role == null ||!role.equals("ADMIN")) {// 用户没有ADMIN角色,重定向到拒绝访问页面或返回错误信息response.sendRedirect("/access-denied");return false;}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 在请求处理之后执行的操作,这里可以添加一些日志记录或者其他处理逻辑}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 在整个请求完成后执行的操作,这里可以进行一些资源清理工作}
}
  1. 注册拦截器
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new AuthorizationInterceptor()).addPathPatterns("/admin/**") // 保护需要ADMIN角色的路径.excludePathPatterns("/login", "/css/**", "/js/**"); // 排除不需要认证的路径}
}
  1. 登录和登出并授权
@Controller
public class LoginController {@PostMapping("/login")public String login(@RequestParam String username, @RequestParam String password, HttpSession session) {// 这里应该进行实际的用户认证逻辑,例如检查数据库// 假设用户名为"admin"的用户具有ADMIN角色if ("admin".equals(username) && "test".equals(password)) {// 认证成功,将用户名和角色存储在Session中session.setAttribute("username", username);session.setAttribute("role", "ADMIN");return "redirect:/dashboard"; // 重定向到仪表板页面} else {// 认证失败,返回登录页面并显示错误消息return "redirect:/login?error";}}@GetMapping("/logout")public String logout(HttpSession session) {// 注销用户,移除Session中的用户名和角色session.removeAttribute("username");session.removeAttribute("role");return "redirect:/login"; // 重定向到登录页面}
}
  1. 设置session最大存活时间
server.servlet.session.timeout=30m
  1. 动态设置session存活时间
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.stereotype.Component;import javax.servlet.ServletContext;
import javax.servlet.ServletException;@Component
public class SessionTimeoutInitializer implements ServletContextInitializer {@Overridepublic void onStartup(ServletContext servletContext) throws ServletException {// 设置Session超时时间为60分钟servletContext.setSessionTimeout(60 * 60);}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 代码随想录:279. 完全平方数
  • Qt 模仿企业微信图标实现按钮图片文字上下结构
  • MDC实现日志链路追踪
  • 高性能计算应用优化之代码实现调优(一)
  • TypeScript Agenda异常 undefined (reading ‘collection‘)
  • word中怎么快速选中光标之前或之后的全部内容?
  • 二、Maven工程的构建--JavaSEJavaEE
  • 软考高级:系统架构设计师——软件架构设计 Chapter 笔记
  • Redis持久化机制—RDB与AOF
  • 海外云手机是否适合运营TikTok?
  • GitLab管理之迁移GitLab群组
  • 基础闯关5
  • ceph-iscsi 手动安装过程中的一些问题记录以及解决办法
  • C# 通过拖控件移动窗体
  • 传统CV算法——基于Opencv的图像绘制
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Angular 4.x 动态创建组件
  • CSS实用技巧
  • C语言笔记(第一章:C语言编程)
  • eclipse的离线汉化
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • iOS 颜色设置看我就够了
  • JavaScript设计模式系列一:工厂模式
  • Js基础知识(四) - js运行原理与机制
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • nodejs实现webservice问题总结
  • PHP那些事儿
  • python 学习笔记 - Queue Pipes,进程间通讯
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 工程优化暨babel升级小记
  • 技术胖1-4季视频复习— (看视频笔记)
  • 利用DataURL技术在网页上显示图片
  • 马上搞懂 GeoJSON
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 深度解析利用ES6进行Promise封装总结
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 用 Swift 编写面向协议的视图
  • 再谈express与koa的对比
  • 你对linux中grep命令知道多少?
  • 大数据全解:定义、价值及挑战
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​Python 3 新特性:类型注解
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • # include “ “ 和 # include < >两者的区别
  • #nginx配置案例
  • (~_~)
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析