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

springsecurity OAuth2.0-第5章 springboot整合 spring security自定义登录页面

目录

一 自定义认证页面

1.1 说明

1.2 自定义登录页面

1.2 配置视图

1.3 认证页面的配置

1.4 配置安全登录信息

1.5 controller登录信息

1.6 启动springboot项目


一 自定义认证页面

1.1 说明

1. 如果用户没有自定义登录页面,spring security 默认会启动自身内部的登录页面,尽管自动生成的登录页面很方便 快速启动和运行,但大多数应用程序都希望定义自己的登录页面。

1.2 自定义登录页面

在新建一个webapp目录,和resouces目录,平级,将login.jsp页面考配到这个页面下:

mylogin.jsp 页面代码:

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="utf-8" %> <html> <head> <title>用户登录</title> </head> <body> <form action="login" method="post"> 用户名:<input type="text" name="username"><br> 密&nbsp;&nbsp;&nbsp;码: <input type="password" name="password"><br> <input type="submit" value="登录"> </form> </body> </html>

1.2 配置视图

在application配置视图跳转的位置

1.3 认证页面的配置

在WebConfig.java中配置认证页面地址:

说明:这里的 setViewName("mylogin"); 指向的是webapp/WEB-INF/view下的mylogin.jsp页面

​ @Configuration//就相当于springmvc.xml文件 public class WebConfig implements WebMvcConfigurer { //默认Url根路径跳转到/login,此url为spring security提供 @Override public void addViewControllers(ViewControllerRegistry registry) { System.out.println("webconfig类中的视图器...."); //这里的setViewName("redirect:/login")跳转spring security跳转自带的登录页面mylogin.jsp页面 // registry.addViewController("/").setViewName("redirect:/login"); registry.addViewController("/").setViewName("redirect:/login-view"); registry.addViewController("/login-view").setViewName("mylogin"); } } ​

1.4 配置安全登录信息

WebSecurityConfig中配置表登录信息:

1.fromLogin(): 允许表单登录
2.loginPage():指定我们自己的登录页;指定的地址会先跳转到webconfig配置的 registry.addViewController("/login-view").setViewName("mylogin"); 然后跳转到web-INF下的view下的mylogin.jsp自定义的登录页面
3.loginProcessingUrl():登录页面进行提交,form表单提交的地址
4.successForwardUrl():指定登录成功后的跳转URL
5.formLogin().permitAll() 我们必须允许所有用户访问我们的登录页(例如为验证的用户),这个 formLogin().permitAll() 方法允许 任意用户访问基于表单登录的所有的URL。

3.代码信息:

package com.ljf.spt.security.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.password.NoOpPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; /** * @author Administrator * @version 1.0 **/ //@EnableWebSecurity @Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter { //1.定义用户信息服务(查询用户信息) @Bean public UserDetailsService userDetailsService(){ InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); manager.createUser(User.withUsername("zhangsan").password("123").authorities("p1").build()); manager.createUser(User.withUsername("lisi").password("456").authorities("p2").build()); return manager; } //2.密码编码器 @Bean public PasswordEncoder passwordEncoder(){ return NoOpPasswordEncoder.getInstance(); } //3.安全拦截机制(最重要) @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); //屏蔽CSRF控制,即spring security不再限制CSRF http.authorizeRequests() .antMatchers("/user/r1").hasAuthority("p1") //p1角色具有访问/user/r1读取权限 .antMatchers("/user/r2").hasAuthority("p2") //p2角色具有访问/user/r2读取权限 .antMatchers("/user/**").authenticated()//所有/user/**的请求必须认证通过 .anyRequest().permitAll()//除了/user/**,其它的请求可以不经过认证,就可以访问 .and() .formLogin()//允许表单登录 .loginPage("/login-view")//指定我们自己的登录页 .loginProcessingUrl("/login") //设置登录页面,用户名和密码提交的表单请求页面 .successForwardUrl("/login-success") //自定义登录成功的页面地址,登录成功跳转的地址 // 我们必须允许所有用户访问我们的登录页(例如为验证的用户),这个 formLogin().permitAll() 方法允许 任意用户访问基于表单登录的所有的URL。 .permitAll();// // } }

1.5 controller登录信息

1.截图

2. 代码:

package com.ljf.spt.ss.controller; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @ClassName: LoginController * @Description: TODO * @Author: admin * @Date: 2023/08/03 18:59:45 * @Version: V1.0 **/ @RestController public class LoginController { @RequestMapping(value = "/login-success",produces = {"text/plain;charset=UTF-8"}) public String loginSuccess(){ return geteUsername()+" 登录成功"; } /** * 测试资源1 * @return */ @GetMapping(value = "/user/r1",produces = {"text/plain;charset=UTF-8"}) public String r1(){ return geteUsername()+" 访问资源1"; } /** * 测试资源2 * @return */ @GetMapping(value = "/user/r2",produces = {"text/plain;charset=UTF-8"}) public String r2(){ return geteUsername()+" 访问资源2"; } //获取当前用户信息 private String geteUsername(){ String username = null; //当前认证通过的用户身份 Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); //用户身份 Object principal = authentication.getPrincipal(); if(principal == null){ username = "匿名"; } if(principal instanceof UserDetails){ UserDetails userDetails = (UserDetails) principal; username = userDetails.getUsername(); }else{ username = principal.toString(); } return username; } }

1.6 启动springboot项目

地址: http://localhost:8080/spt-security/login-view

访问资源r1

访问资源r2:

http://www.jsqmd.com/news/1130719/

相关文章:

  • 基于异步编程与Playwright的高效自动化任务处理与状态监控系统构建
  • Debian 11 使用
  • GPT应用开发实战:从场景设计到架构落地的完整指南
  • AI Agent赋能智能钱包:从链上数据分析到个性化金融顾问
  • Kimi K2.6 vs GLM-5.1 实测横评:15个真实工作流能力切片
  • 5分钟掌握Mac制作Windows启动盘的终极指南:WindiskWriter完整教程
  • 医学影像异常检测:MVFA框架的零样本与少样本实践
  • iPerf3 使用指南
  • 水利枢纽三维智能监控技术解析与应用
  • 3 种梯度计算方式对比:数值微分、符号微分与反向传播的效率分析
  • 5分钟快速上手C-Qwen3-Embedding-Reranker-0.6B:轻量级文本嵌入模型的终极指南
  • AI驱动数据库死锁自动检测与智能解决实践
  • 大数据原生集群 (Hadoop2.X为核心) 本地测试环境搭建二
  • MobaXterm连接RedHat服务器SSH密钥登录失败排查与配置详解
  • 水下图像增强算法:双通道输入与四维权重体系详解
  • 计算机网络 | 路由器局域网(内网)IP和外网(公网)IP的区别与联系
  • Pixel2Geo技术:从二维视觉到三维空间智能的突破
  • Python依赖注入的架构解耦策略:python-inject的生命周期管理艺术
  • 如何用ComfyUI-KJNodes解决AI工作流复杂性问题:实战指南
  • ICM-42688-P与MKV44F64VLH16在工业自动化中的高性能应用
  • Workflow 系列(08):运营与成本——跨 Phase 成本追踪与故障排查
  • 工业级传感器与执行器控制方案:基于AD74115H与STM32F765ZI
  • Spring Boot与Vue3前后端RSA加密登录实战:原理、实现与安全优化
  • springsecurity OAuth2.0-第6章: 认证与授权查询数据库信息
  • 洛雪音乐全网音源完全指南:从零开始打造你的个性化音乐库
  • Linux Shell脚本参数传递与条件判断的方法
  • 新手必看:Cities: Skylines多人联机CSM常见问题与解决方案
  • 零代码AI智能体革命:如何用一句话创建企业级多模态AI服务
  • 实现mini-vue3
  • YOLOv12遥感目标检测:MGCM模块创新与应用